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执行和部署的一些限制: