關於使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章