AWS自动扩缩容组(ASG)缩容时如何选择要移除的EC2实例?
AWS Auto Scaling Group(ASG)缩容实例选择逻辑及任务状态感知机制
一、ASG缩容时的实例选择规则
ASG提供了多种预设的实例选择策略,你可以在ASG配置中指定,默认策略为OldestLaunchConfiguration,常见策略包括:
- OldestLaunchConfiguration:优先移除使用最旧启动配置的实例;若所有实例使用同一种启动配置,则自动切换为OldestInstance策略
- OldestInstance:优先移除创建时间最早的实例
- NewestInstance:优先移除创建时间最晚的实例
- ClosestToNextInstanceHour:优先移除距离下一个计费小时最近的实例,适合成本优化场景
- Default:与OldestLaunchConfiguration逻辑一致
另外,你可以通过实例保护功能锁定特定实例:启用该功能后,ASG在缩容时会直接跳过这些实例,除非你手动关闭保护或执行强制缩容操作。
二、ASG如何感知实例的任务运行状态
ASG本身不会主动检测实例内部的任务执行状态,需要通过以下方式实现状态反馈,让ASG在缩容时避开正在工作的实例:
1. 生命周期钩子(Lifecycle Hooks)
这是最灵活的解决方案:当ASG触发缩容流程时,会先触发一个Terminating:Wait类型的生命周期钩子,暂停实例的终止操作。此时你可以通过自定义脚本或Lambda函数完成以下操作:
- 检查实例上的任务状态(比如通过
ps aux | grep "running-task"查看进程,或读取任务状态文件) - 如果实例正在执行任务,保持钩子的等待状态,直到任务完成
- 确认实例空闲后,调用AWS CLI或SDK发送
CompleteLifecycleAction命令,允许ASG继续终止实例
示例CLI命令:
aws autoscaling complete-lifecycle-action \ --lifecycle-hook-name my-task-protection-hook \ --auto-scaling-group-name my-production-asg \ --lifecycle-action-result CONTINUE \ --instance-id i-0abc123def456ghi7
2. 负载均衡器连接 draining(适用于网络请求类任务)
如果ASG关联了ALB/NLB,缩容时负载均衡器会自动启动连接 draining 流程:
- 停止向待终止实例发送新请求
- 等待现有连接处理完成(可配置超时时间),之后再允许ASG终止实例
这种方式仅适用于HTTP/HTTPS、TCP等网络连接类任务,无法覆盖后台离线任务场景。
3. 自定义健康状态上报
你可以在实例上运行健康检查脚本,通过PutInstanceHealth API向ASG上报实例状态:
- 当实例正在执行任务时,上报
Healthy状态,结合缩容策略避免被优先选中 - 当实例空闲时,可上报
Unhealthy状态(需注意:ASG会自动替换不健康实例,仅适合需要主动回收空闲实例的场景)
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

