我一直试图在CloudFormation UserData部分中标记附加到EC2实例的EBS卷。这是我的第一次尝试:
示例1:
AWS_INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
ROOT_DISK_ID=`aws ec2 describe-volumes \
--filter Name=attachment.instance-id,Values="${AWS_INSTANCE_ID}" \
--query "Volumes[].VolumeId" --region us-east-1 --out text`
aws ec2 create-tags --resources "${ROOT_DISK_ID}" \
--tags 'Key=VolumeTagName,Value=VolumeTagValue' --region us-east-1
这导致一个Template format error: Unresolved resource dependencies [AWS_INSTANCE_ID, ROOT_DISK_ID] in the Resources block of the template
错误。
我碰到的一篇帖子提到,在Cloudformation UserData脚本中调用变量时使用!
可以解决此问题,所以现在看起来像这样:
示例2:
AWS_INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
ROOT_DISK_ID=`aws ec2 describe-volumes \
--filter Name=attachment.instance-id,Values="${!AWS_INSTANCE_ID}" \
--query "Volumes[].VolumeId" --region us-east-1 --out text`
aws ec2 create-tags --resources "${!ROOT_DISK_ID}" \
--tags 'Key=VolumeTagName,Value=VolumeTagValue' --region us-east-1
可以解决该错误,但是仍然没有标签显示在使用此模板启动的实例所连接的卷上。如果我使用ssh进入实例并运行示例1 ,则效果很好。 示例2 不会给我任何错误。
我在bash中做错了什么,这是Cloudformation特有的?
答案 0 :(得分:0)
如果我正确理解,您正在尝试使用cloudformation创建脚本,然后在启动时在ec2-instance上执行该脚本。使用yaml,这是我的userdata部分:
OR pd.tag LIKE '%conjunto%'
由于使用的区域,我更改了区域。
如果我查看script.sh文件的内容,则会得到以下信息:
UserData: !Base64
Fn::Join:
- ''
- - "#!/bin/bash -xe \n"
- "cat << 'EOF' > /home/ec2-user/script.sh \n"
- "AWS_INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`\n"
- "ROOT_DISK_ID=`aws ec2 describe-volumes "
- "--filter Name=attachment.instance-id,Values=\"${AWS_INSTANCE_ID}\" "
- "--query \"Volumes[*].[VolumeId]\" --region eu-west-1 --out text`\n"
- "aws ec2 create-tags --resources \"${ROOT_DISK_ID}\" "
- "--tags 'Key=MyAutoTagName,Value=MyAutoTagValue' --region eu-west-1\n"
- "EOF\n"
- "chmod +x /home/ec2-user/script.sh\n"
- "/home/ec2-user/script.sh\n"
我唯一看到的区别是您的“ 卷[]。[VolumeId] * ”,我不确定您的userdata部分是什么样子,因此可能是转义的问题。 一旦实例被旋转并运行了userdata部分,就会在标签上方使用我的UserData部分创建标签。