关于使用Lambda修改EC2 instance type 小结

1. 关于Lambda的基础使用可以参考我的前几篇文章的小结。

  通过上面的小结,你已经具备了Lambda的开发环境。

2. 查了下资料,官网只有简短的接口介绍,主要使用的是ModifyInstanceAttributeRequest,而其中的详细参数列表可以参考:Request Parameters

官方提供了两个版本的SDK,下载源码后可以很方便地找到example,但是很遗憾这里要用到的修改实例的例子并没有出现,所以根据S3和Athena这些Demo的使用,作出了以下测试总结。(以下是以Java v2为例子做的总结)

3. 首先是在本地测试暂停EC2和修改EC2实例类型。

1) 添加pom.xml依赖。

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>ec2</artifactId>
  <version>2.5.10</version>
</dependency>

2) 创建一台EC2,这里假设你的instanceid是i-0d76ff7ef27f02307

3) 测试启动实、暂停实例。

public static void startInstance(String instance_id)
{
	// snippet-start:[ec2.java2.start_stop_instance.start]
	Ec2Client ec2 = Ec2Client.builder().region(Region.of("us-east-2")).build();

	StartInstancesRequest request = StartInstancesRequest.builder()
		.instanceIds(instance_id).build();

	ec2.startInstances(request);

	// snippet-end:[ec2.java2.start_stop_instance.start]
	System.out.printf("Successfully started instance %s", instance_id);
}

public static void stopInstance(String instance_id)
{
	// snippet-start:[ec2.java2.start_stop_instance.stop]
	Ec2Client ec2 = Ec2Client.builder().region(Region.of("us-east-2")).build();

	StopInstancesRequest request = StopInstancesRequest.builder()
		.instanceIds(instance_id).build();

	ec2.stopInstances(request);

	// snippet-end:[ec2.java2.start_stop_instance.stop]
	System.out.printf("Successfully stop instance %s", instance_id);
}

注:这里的启动和暂停实例都不会堵塞主线程,所以如果需启动后立刻执行后续操作,要注意休眠主线程等待EC2重启成功。

4) 测试修改实例类型。

 public static void modifyInstance(String instance_id, String type)
{
	Ec2Client ec2 = Ec2Client.builder().region(Region.of("us-east-2")).build();
	ModifyInstanceAttributeRequest request = ModifyInstanceAttributeRequest.builder()
			.instanceId(instance_id).instanceType(AttributeValue.builder().value(type).build()).build();

	ec2.modifyInstanceAttribute(request);
	System.out.println();
}

5) 测试demo的源码下载

4. 通过Lambda函数来实现暂停EC2和修改EC2 实例类型,修改完成后启动实例。

1) Lambda函数逻辑如下。

private Ec2Client ec2 = Ec2Client.builder().region(Region.of("us-east-2")).build();

@Override
public String handleRequest(Map<String, String> event, Context context) {
	context.getLogger().log("Received event: " + event);

	String instance_id = "i-0d76ff7ef27f02307";
	stopInstance(instance_id);
	try {
		Thread.sleep(20*1000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	modifyInstance(instance_id, "t2.micro");
	
	startInstance(instance_id);
	
	return "okokok okokok";
}

2) 测试Lambda函数,测试的EC2状态是stopped的,类型将改成"t2.micro"。

: trigger函数前要记得确保role有access ec2的权限,否则会导致函数执行失败。

3) stopping ec2过程中。

4) 修改了ec2类型后正在启动。

5) ec2的最终状态。

6) Lambda输出的日志。

5. 以上的步骤使用场景可以结合Cloud Watch的Event,比如定时调度的程序在每个月的月底(0 0 L * ? *)都需要比平时更多内存或CPU,那么可以通过这个来定时trigger,并且在月初(0 0 1 * ? *)的时候再还原。创建Events如图:

 

1. Aws 可用的实例类型:Available instance types

2. Javascript SDK修改instance type可以参考:Modify the instance type

3. 定时停止和启动EC2实例参考:Lambda 按固定间隔停止和启动EC2

4. 下图是关于Lambda执行和部署的一些限制:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值