CloudWatch Events觸發Lambda修改RDS instance type 小結

1. 在實現之前,先了解下RDS都有哪些實例類型吧。

2. 和我的另一篇修改EC2實例類型的文章一樣,如果還沒有具備本地開發Lambda的環境,先看看我的這篇文章吧。

  通過上面的小結,你已經具備了Lambda的開發環境。

3. 在實現CloudWatch Events觸發Lambda之前,首先先講講如何通過Lambda修改RDS實例類型吧。

查了下資料,官網只有簡短的接口介紹,主要使用的是ModifyDbInstanceRequest,而其中的詳細參數列表可以參考:Request Parameters

1) 首先是在本地測試暫停RDS實例和修改RDS實例類型。

a) 添加pom.xml依賴。

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

b) 創建一個RDS實例,假設這裏的DB Identifier是testIdentifier。

c) 測試啓動實、暫停實例。

public static void startInstance(String identifier) {
	RdsClient rdsClient = RdsClient.builder().region(Region.of("us-east-2")).build();

	StartDbInstanceRequest request = StartDbInstanceRequest.builder().dbInstanceIdentifier(identifier).build();

	rdsClient.startDBInstance(request);

	System.out.printf("Successfully started instance %s", identifier);
}

public static void stopInstance(String identifier) {
	RdsClient rdsClient = RdsClient.builder().region(Region.of("us-east-2")).build();

	StopDbInstanceRequest request = StopDbInstanceRequest.builder().dbInstanceIdentifier(identifier).build();

	rdsClient.stopDBInstance(request);

	System.out.printf("Successfully stop instance %s", identifier);
}

:這裏的啓動和暫停實例都不會堵塞主線程,所以如果需啓動後立刻執行後續操作,要注意休眠主線程等待實例重啓成功。RDS實例啓動和暫停一般需要5-10分鐘。

d) 測試修改實例類型。

public static void modifyInstance(String identifier, String type) {
	RdsClient rdsClient = RdsClient.builder().region(Region.of("us-east-2")).build();

	ModifyDbInstanceRequest request = ModifyDbInstanceRequest.builder().dbInstanceIdentifier(identifier)
			.dbInstanceClass(type).applyImmediately(true).build();

	rdsClient.modifyDBInstance(request);

	System.out.println();
}

e) 測試demo的源碼下載

2) 通過Lambda函數來實現暫停RDS和修改RDS 實例類型(修改實例類型需要在Available狀態)。

@Override
public String handleRequest(Map<String, String> event, Context context) {
	context.getLogger().log("Received event: " + event);
	String action = event.get("action");
	String identifier = event.get("identifier");
	
	switch (action) {
	case "start":
		startInstance(identifier);
		break;
	case "stop":
		stopInstance(identifier);
		break;
	case "modify":
		String type = event.get("type");
		modifyInstance(identifier, type);
		break;
	default:
		break;
	}
	return "okokok okokok";
}

:這裏的event將會從CloudWatch Event觸發Lambda時傳遞過來。

3) 測試Lambda函數,現在的實例狀態如圖。

a) 創建Lambda test events,如圖:

b) 測試modify流程。 

作爲測試,test event輸入以下的json參數。

{
  "action": "modify",
  "identifier": "testidentifier",
  "type": "db.t2.small"
}

此時的Status是Modifying,幾分鐘後實例類型就會修改成了db.t2.small。

然後,Status又會變成Available。

日誌輸出如下: 

c) 測試stop流程。

test event輸入以下的json參數。

{
  "action": "stop",
  "identifier": "testidentifier"
}

 此時的Status是Stopping。

大概十分鐘左右的等待,Status纔是Stopped。 

4. CloudWatch的Events添加Rules。

Constant (JSON text)寫入:{   "action": "start",   "identifier": "testidentifier" } 。

如圖,這裏生成Cron表達式指的是每小時觸發Lambda以啓動實例。

5. 假設創建了名爲test-start的Rule,並且每次35分的時候都觸發Lambda,如圖:

 

1. 如何在 CloudWatch 中將計劃觸發器的參數傳遞到 AWS Batch 作業

 

1. 如果遇到:InvalidDbInstanceStateException: Cannot modify a stopped DB Instance (Service: Rds, Status Code: 400...

  因爲實例的Status不是Available的話,這時不能修改類型。

2. 在實例已啓動時,再執行start命令,會導致:InvalidDbInstanceStateException: Instance termcondition is not stopped, cannot be started. (Service: Rds, Status Code: 400...

3. 如果在啓動過程中就修改類型,會導致:InvalidDbInstanceStateException: Database instance is not in available state. (Service: Rds, Status Code: 400...

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