AWS CloudFormation不遵守隐式依赖 关联EC2的EBS卷删除报错如何解决
CloudFormation删除堆栈时EBS卷先于EC2实例删除报错解决方案
问题根因
你对CloudFormation隐式依赖的基础规则理解没有错误,该问题属于通过AWS::EC2::Instance的Volumes属性挂载独立EBS卷场景下的已知资源行为:
- 创建阶段CloudFormation可以正确推断依赖顺序:先创建EBS卷,再创建EC2实例并完成挂载
- 删除阶段由于你为EBS卷配置了
DeletionPolicy: Snapshot,而CloudFormation在删除通过Volumes属性挂载的独立EBS卷前,不会自动卸载卷,且快照要求卷必须处于未挂载的可用状态,因此CloudFormation会跳过隐式依赖的删除顺序规则,先尝试卸载/删除EBS卷,此时EC2实例尚未终止,就会抛出你遇到的报错:
Volume vol-xxxxxx is currently attached to i-xxxxxx
解决方案
最稳妥的修复方式是将原本写在EC2 Volumes属性中的挂载逻辑拆分为独立的AWS::EC2::VolumeAttachment资源,依赖关系完全显式可控,模板示例如下:
Resources: SasEbsVolume: Type: AWS::EC2::Volume DeletionPolicy: Snapshot Properties: # 原有EBS卷配置保持不变 ... SasInstance: Type: AWS::EC2::Instance Properties: # 原有EC2配置保持不变,删除Volumes字段 ... SasVolumeAttachment: Type: AWS::EC2::VolumeAttachment Properties: InstanceId: !Ref SasInstance VolumeId: !Ref SasEbsVolume Device: /dev/xvdd
该配置下的删除顺序为:先卸载卷(删除VolumeAttachment资源)→ 终止EC2实例 → 对EBS卷创建快照后删除卷,完全不会出现挂载冲突。
内容的提问来源于stack exchange,提问作者David Gard
相关产品推荐
相关产品推荐

