无法使用UserData bash脚本标记EBS卷

时间:2019-04-04 00:47:30

标签: amazon-web-services amazon-cloudformation user-data

我一直试图在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特有的?

1 个答案:

答案 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部分创建标签。