如何实现AWS EC2实例夜间自动降配、早间自动升配调度?
AWS EC2 定时升降配+启停实现方案
前置依赖确认
你已经完成的IAM角色配置、CloudWatch+Lambda基础调度能力可直接复用,仅需替换Lambda执行代码、新增两条触发规则即可实现需求。
环境变量配置
Lambda函数中提前添加两个环境变量:
EC2_INSTANCE_ID:需要操作的EC2实例IDTARGET_INSTANCE_TYPE:当前触发规则要切换的目标实例规格,夜间触发规则配t2.small,早间触发规则配t2.xlarge
确保Lambda关联的IAM角色已包含以下操作权限:ec2:StopInstances、ec2:ModifyInstanceAttribute、ec2:StartInstances、ec2:DescribeInstances
Lambda核心代码(Python 3.9+)
import boto3 import os # 初始化EC2客户端 ec2_client = boto3.client('ec2') # 从环境变量读取配置 INSTANCE_ID = os.environ.get('EC2_INSTANCE_ID') TARGET_TYPE = os.environ.get('TARGET_INSTANCE_TYPE') def lambda_handler(event, context): # 查询实例当前状态和规格 instance_info = ec2_client.describe_instances(InstanceIds=[INSTANCE_ID])['Reservations'][0]['Instances'][0] current_state = instance_info['State']['Name'] current_type = instance_info['InstanceType'] # 规格符合且正在运行则无需操作 if current_type == TARGET_TYPE and current_state == 'running': print(f"实例{INSTANCE_ID}已符合预期状态,无需执行操作") return # 实例处于运行状态则先停止 if current_state == 'running': print(f"开始停止实例:{INSTANCE_ID}") ec2_client.stop_instances(InstanceIds=[INSTANCE_ID]) # 等待实例停止完成,每10秒检查一次,最多等待300秒 stop_waiter = ec2_client.get_waiter('instance_stopped') stop_waiter.wait( InstanceIds=[INSTANCE_ID], WaiterConfig={'Delay': 10, 'MaxAttempts': 30} ) print(f"实例{INSTANCE_ID}已停止") # 修改实例规格 print(f"开始修改实例{INSTANCE_ID}规格为:{TARGET_TYPE}") ec2_client.modify_instance_attribute( InstanceId=INSTANCE_ID, InstanceType={'Value': TARGET_TYPE} ) print(f"实例规格修改完成") # 启动实例 print(f"开始启动实例:{INSTANCE_ID}") ec2_client.start_instances(InstanceIds=[INSTANCE_ID]) # 等待实例启动完成 start_waiter = ec2_client.get_waiter('instance_running') start_waiter.wait( InstanceIds=[INSTANCE_ID], WaiterConfig={'Delay': 10, 'MaxAttempts': 30} ) print(f"实例{INSTANCE_ID}已启动,当前规格为:{TARGET_TYPE}")
CloudWatch触发规则配置
创建两条独立的定时触发规则即可:
- 夜间调度规则:设置为你需要的夜间执行时间(例如每日23:00),关联上述Lambda函数,环境变量
TARGET_INSTANCE_TYPE设置为t2.small - 早间调度规则:设置为你需要的工作日早间执行时间(例如每日7:30),关联上述Lambda函数,环境变量
TARGET_INSTANCE_TYPE设置为t2.xlarge
注意选择你所在的对应时区,避免定时时间出现偏差
注意事项
- 仅EBS存储的EC2实例支持不停数据升降配,若你的实例挂载了实例存储,升降配会导致实例存储的数据丢失,操作前请提前备份
- 若实例开启了终止保护,需要先关闭终止保护才能修改实例规格
- 代码默认的等待超时时间为300秒,若你的实例启停耗时较长,可以自行调整
WaiterConfig中的MaxAttempts参数
内容的提问来源于stack exchange,提问作者Ausaf Ulhaq
相关产品推荐
相关产品推荐

