CloudWatch Events触发Lambda修改RDS instance type 小结

3 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值