AWS ImageBuilder组件Data段解析错误:EC2卷卸载脚本求助
解决AWS ImageBuilder组件YAML解析错误问题
你的错误根源是YAML解析器误将命令中的冒号(即使在HTTP头参数里)识别为键值对分隔符,导致无法把命令字符串正确解析,而非单纯的冒号问题。以下是两种可行的修复方案:
方案一:给每个命令添加单引号包裹
将每条bash命令用单引号包裹,强制YAML将其视为纯字符串,避免解析歧义:
name: ExecuteDetachScript action: ExecuteBash inputs: commands: - 'TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 30")' - 'INSTANCE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id)' - 'VOLUME_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$INSTANCE_ID Name=attachment.device,Values="/dev/sdf" | jq -r ".Volumes[].VolumeId")' - 'aws ec2 detach-volume --volume-id $VOLUME_ID'
方案二:使用YAML折叠块定义多行命令
如果脚本较长,推荐用YAML的折叠块(|)来定义整个脚本内容,这种方式更简洁,且能保留命令的原始格式:
name: ExecuteDetachScript action: ExecuteBash inputs: commands: | TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 30") INSTANCE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id) VOLUME_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$INSTANCE_ID Name=attachment.device,Values="/dev/sdf" | jq -r ".Volumes[].VolumeId") aws ec2 detach-volume --volume-id $VOLUME_ID
额外注意事项
- 确保ImageBuilder使用的实例角色具备
ec2:DescribeVolumes和ec2:DetachVolume的IAM权限,否则脚本执行会因权限不足失败。 - 提前验证
/dev/sdf是当前实例上已挂载的卷设备名,避免VOLUME_ID为空导致 detach 命令报错。
内容的提问来源于stack exchange,提问作者CJ Chang
相关产品推荐
相关产品推荐

