如何删除CloudFormation栈时自动终止Auto Scaling Group关联的EC2实例
解决CloudFormation删除栈时Auto Scaling Group实例无法自动终止的问题
核心原因
你的Auto Scaling Group(ASG)配置了NewInstancesProtectedFromScaleIn: true,这会让实例处于缩容保护状态,CloudFormation尝试删除ASG时,无法自动终止受保护的实例,导致删除操作超时失败。另外,默认情况下ASG删除时不会主动将期望容量调整为0,这也会阻碍实例的自动终止。
解决方案
方法1:调整ASG的删除与更新策略
在ASG资源中添加删除前自动调整容量的配置,确保删除流程先将实例缩容至0:
修改后的ASG模板片段:
ECSAutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup DependsOn: - ECSCluster - EC2Role Properties: VPCZoneIdentifier: !Ref SubnetIds LaunchTemplate: LaunchTemplateId: !Ref ContainerInstances Version: !GetAtt ContainerInstances.LatestVersionNumber MinSize: 0 MaxSize: !Ref MaxSize DesiredCapacity: !Ref DesiredCapacity NewInstancesProtectedFromScaleIn: true UpdatePolicy: AutoScalingReplacingUpdate: WillReplace: 'true' # 添加删除前自动缩容的规则 AutoScalingRollingUpdate: MinInstancesInService: 0 MaxBatchSize: !Ref MaxSize DeletionPolicy: Delete
方法2:移除缩容保护(按需选择)
如果你的场景不需要实例缩容保护,可以直接关闭该配置,这样CloudFormation删除ASG时能自动终止所有实例:
# 将原配置中的这一行改为false或删除 NewInstancesProtectedFromScaleIn: false
方法3:应急手动处理(针对已卡住的栈)
如果栈已经处于删除失败的状态,可以先手动操作清理:
- 进入Auto Scaling控制台,找到目标ASG,将
DesiredCapacity设为0 - 手动移除实例的缩容保护(若开启)
- 等待所有实例终止后,重新发起CloudFormation栈删除操作
关键注意事项
NewInstancesProtectedFromScaleIn适合运行核心业务的实例,但在测试环境或需要自动清理的场景中,建议关闭或在删除流程中自动移除保护- CloudFormation只有在ASG的所有关联实例都终止后,才能成功删除ASG资源,因此删除前将期望容量调至0是核心解决步骤
内容的提问来源于stack exchange,提问作者Adel Tahir
相关产品推荐
相关产品推荐

