使用CloudFormation为EC2实例挂载多块EBS卷仅最后一个生效求助
嘿,我来帮你搞定这个问题!这种情况在配置CloudFormation多EBS卷时真的挺常见的,大概率是BlockDeviceMappings的配置结构出了问题,尤其是出现了覆盖逻辑或者语法错误。我给你列几个最可能的原因和解决办法:
重复的设备名或错误的数组结构
这是最常见的坑!如果在BlockDeviceMappings里你不小心给多个卷用了同一个DeviceName,或者没把每个卷作为独立的数组项,CloudFormation就会直接覆盖前面的配置,只保留最后一个。比如错误写法:BlockDeviceMappings: - DeviceName: "/dev/sdf" Ebs: VolumeSize: 50 - DeviceName: "/dev/sdf" # 重复设备名,直接覆盖前面的50GB卷 Ebs: VolumeSize: 100正确的写法应该是每个卷都是数组里的独立对象,且设备名唯一:
BlockDeviceMappings: - DeviceName: "/dev/sdf" Ebs: VolumeSize: 50 DeleteOnTermination: true - DeviceName: "/dev/sdg" Ebs: VolumeSize: 80 DeleteOnTermination: true - DeviceName: "/dev/sdh" Ebs: VolumeSize: 100 DeleteOnTermination: true缩进错误导致的语法解析问题
YAML对缩进特别敏感,如果前面的卷配置不小心缩进成了最后一个卷的子属性,CloudFormation会把它们当成无效配置直接忽略,只处理最后一个正确的卷。遇到这种情况,你可以用CloudFormation控制台的Validate Template功能快速检查语法问题。根卷映射的冲突
如果你没在模板里显式定义根卷的BlockDeviceMapping,CloudFormation会用默认配置(比如/dev/sda1)。如果你的其他卷不小心用了和根卷相同的设备名,就会被默认配置覆盖掉。记得给额外的卷用/dev/sdf到/dev/sdz这类非默认设备名。动态生成卷时的逻辑错误
要是你用了Fn::ForEach或者参数循环来生成多卷,可能是循环逻辑出了问题——比如设备名没正确递增,或者循环范围只执行了最后一次,导致只生成了最后一个卷。
给你个快速排查小技巧:去CloudFormation控制台看栈的事件日志,看看前面的卷是不是被标记为「删除」或「替换」,这能直接确认是不是被后面的配置覆盖了。
内容的提问来源于stack exchange,提问作者swap709

