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...