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