为何开启保护的Amazon EC2仍被Auto Scaling Group终止?
问题解答:开启终止保护和缩容保护的EC2实例仍被ASG终止是否符合预期?
这种行为完全符合AWS Auto Scaling Group(ASG)的设计逻辑,下面我会结合你的场景和AWS的规则详细解释:
一、先明确两个保护机制的适用范围
你开启的两个保护,作用场景是不同的,都不覆盖「健康检查失败触发的实例替换」:
- EC2实例终止保护:仅阻止手动终止实例(比如在EC2控制台手动点终止、通过API调用终止),或者非ASG发起的终止操作。但ASG作为实例的管理方,当它判定实例不健康需要替换时,会绕过这个保护直接终止实例。
- ASG实例缩容保护:这个保护是为了防止ASG在主动缩容动作中终止实例——比如当你调整ASG期望实例数降低、或者基于CloudWatch指标(比如你设置的NetworkOut)触发缩容时,开启了缩容保护的实例不会被选中终止。但它不阻止ASG替换不健康的实例,因为这属于「健康替换」而非「缩容」操作。
二、结合你的场景具体分析
你模拟的流程是:
- 将EC2切到Standby模式,停止IIS后切回InService但未启动IIS
- ALB的健康检查检测到实例不健康,将其从目标组移除
- ASG发现实例被标记为不健康,触发替换流程,终止了受保护的实例
这正是ASG的正常行为:当ASG通过ELB健康检查判定实例不健康时,它会自动启动一个新的健康实例来替换这个故障实例,确保你的集群始终维持健康的实例数(你设置了至少2台)。这个替换流程不受缩容保护和EC2终止保护的限制,因为它的目的是保障服务可用性,而非缩容。
三、如果想避免这种情况的建议
如果你希望在实例健康检查失败时,ASG不要直接终止它,而是给你修复的时间,可以考虑:
- 调整ALB的健康检查阈值:比如增加「不健康阈值」的次数,延长检测间隔,给你足够的时间修复实例
- 使用ASG的Standby模式:当你需要维护实例时,主动将实例切换到Standby模式,此时ASG会认为这个实例暂时不可用,会启动新实例补充,而不会终止Standby状态的实例,等你维护完成后再切回InService
- 自定义ASG的健康检查策略:比如结合CloudWatch告警或者自定义健康检查脚本,只有在满足特定条件时才触发替换
内容的提问来源于stack exchange,提问作者tybalt




