求助:如何实现RDS实例定时自动扩缩容(EST时段切换db.m6g规格)
实现RDS定时自动扩缩容方案
核心方案
采用AWS EventBridge(定时触发)+ Lambda函数(执行实例规格修改)的无服务器方案,无需维护额外服务器,成本低且易运维。
步骤1:创建Lambda所需的IAM角色
- 新建IAM角色,信任关系指定为Lambda服务
- 附加最小权限策略(替换占位符为你的实际信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds:ModifyDBInstance", "rds:DescribeDBInstances" ], "Resource": "arn:aws:rds:你的区域ID:你的账号ID:db:你的RDS实例名" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }
步骤2:编写Lambda函数(Python示例)
同一个函数可处理升级、降级操作,通过EventBridge传递的参数区分目标规格:
import boto3 rds_client = boto3.client('rds') def lambda_handler(event, context): db_instance_id = '你的RDS实例名' target_class = event.get('target_instance_class') if not target_class: raise ValueError("未传入目标实例规格参数") try: response = rds_client.modify_db_instance( DBInstanceIdentifier=db_instance_id, DBInstanceClass=target_class, ApplyImmediately=True # 立即生效;若业务无法接受即时中断,可设为False,在维护窗口执行 ) print(f"规格修改请求提交成功,当前目标规格: {response['DBInstance']['DBInstanceClass']}") return {"status": "success", "message": f"正在切换至{target_class}"} except Exception as e: print(f"规格修改失败: {str(e)}") raise e
提示:
ApplyImmediately=True会触发实例重启,业务会有30秒-2分钟的短暂中断;多AZ实例的中断时间通常更短。
步骤3:创建EventBridge定时规则
创建两个独立规则分别触发升级和降级:
规则1:EST每日5:00升级至db.m6g.8xlarge
- 规则类型:计划
- 调度表达式(转换为UTC时区,EST=UTC-5):
cron(0 10 * * ? *) - 目标:选择你创建的Lambda函数
- 配置常量输入JSON:
{"target_instance_class": "db.m6g.8xlarge"}
规则2:EST每日17:00降级回db.m6g.xlarge
- 规则类型:计划
- 调度表达式(转换为UTC时区):
cron(0 22 * * ? *) - 目标:选择同一个Lambda函数
- 配置常量输入JSON:
{"target_instance_class": "db.m6g.xlarge"}
关键注意事项
- RDS实例必须处于可用状态才能执行规格修改,若有正在进行的备份、升级等操作会导致失败
- 建议先手动触发Lambda函数测试修改逻辑,确认无问题后再启用定时规则
- 通过CloudWatch日志监控Lambda执行状态,及时排查失败情况
内容的提问来源于stack exchange,提问作者Fahd Mirza
相关产品推荐
相关产品推荐

