如何根据EC2自动启停计划调度ASG启停,避免生成冗余实例?
调度Auto Scaling Group启停的可行方案
针对你遇到的ASG自动补实例问题,不用禁用ASG或移除实例的话,核心思路是从ASG的配置本身入手,而非直接操作EC2实例,以下是几种实用方案:
1. 动态调整ASG的期望实例数与最小实例数
这是最直接的方案,通过修改ASG的DesiredCapacity和MinSize参数,控制实例的启停:
- 非办公时段:将
MinSize和DesiredCapacity都设为0,ASG会自动终止所有运行中的实例,且不会启动新实例 - 办公时段:将两个参数改回业务所需的正常值(比如
MinSize=1,DesiredCapacity=1)
你可以用现有Lambda扩展这个逻辑,调用AWS SDK的update_auto_scaling_group接口,示例Python代码:
import boto3 def lambda_handler(event, context): asg_client = boto3.client('autoscaling') target_asg = '你的ASG名称' # 根据触发时间判断是上班还是下班,这里示例设为下班时段逻辑 is_off_hours = True # 实际可通过事件时间或CloudWatch定时触发判断 if is_off_hours: asg_client.update_auto_scaling_group( AutoScalingGroupName=target_asg, MinSize=0, DesiredCapacity=0 ) else: asg_client.update_auto_scaling_group( AutoScalingGroupName=target_asg, MinSize=1, DesiredCapacity=1 )
2. 使用ASG原生的计划扩展动作
AWS ASG自带计划调度功能,无需额外维护Lambda,直接在ASG中配置定时动作:
- 登录AWS控制台,找到目标ASG,进入「计划的操作」标签
- 创建两个计划动作:
- 上班触发(如周一至周五9:00):设置
最小容量、期望容量为业务值 - 下班触发(如周一至周五18:00):设置
最小容量、期望容量为0
- 上班触发(如周一至周五9:00):设置
- 也可以用CLI创建:
# 创建下班时段的计划动作 aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name 你的ASG名称 \ --scheduled-action-name ScaleDownOffHours \ --schedule "cron(0 10 ? * MON-FRI *)" # UTC时间,对应北京时间18:00 --min-size 0 \ --desired-capacity 0 # 创建上班时段的计划动作 aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name 你的ASG名称 \ --scheduled-action-name ScaleUpOnHours \ --schedule "cron(0 1 ? * MON-FRI *)" # UTC时间,对应北京时间9:00 --min-size 1 \ --desired-capacity 1
3. 结合实例保护保留特定EC2实例
如果需要保留特定实例(比如有本地配置或数据),可以给目标实例开启实例保护,阻止ASG在你停止实例后自动替换:
- 在EC2控制台找到目标实例,右键选择「实例设置」→「更改实例保护」,开启「防止终止」
- 然后用Lambda正常启停该实例,ASG不会因为实例停止而启动新实例(前提是ASG的期望容量等于当前运行实例数)
- 注意:如果后续需要ASG自动扩容,记得关闭实例保护或调整期望容量
内容的提问来源于stack exchange,提问作者Mirza
相关产品推荐
相关产品推荐

