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