【问题标题】:aws ec2 run-instances: base64 encoded user-data blob is ignoredaws ec2 运行实例:base64 编码的用户数据 blob 被忽略
【发布时间】:2021-09-11 16:35:16
【问题描述】:

运行aws ec2 run-instances 命令时,我的base64 编码用户数据被忽略。

这是我的用户数据:

$ cat user-data.sh 
#!/bin/bash
cat >> /var/tmp/user-data-testing <<EOF
this is test line added at $(date)
EOF

这是上面脚本的base64 blob:

IyEvYmluL2Jhc2gKY2F0ID4+IC92YXIvdG1wL3VzZXItZGF0YS10ZXN0aW5nIDw8RU9GCnRoaXMgaXMgdGVzdCBsaW5lIGFkZGVkIGF0ICQoZGF0ZSkKRU9GCg==

现在,我下面的命令确实可以很好地读取用户数据:

aws ec2 run-instances --image-id ami-8635a9b6 --instance-type t1.micro --placement AvailabilityZone=us-west-2a --security-groups quicklaunch-1 --key-name devops --user-data file://user-data.sh

我确实看到文件 /var/tmp/user-data-testing 已创建。

但是,当我尝试将用户数据作为 base64 编码的 blob 传入时,如下所示,它会被忽略:

aws ec2 run-instances --image-id ami-8635a9b6 --instance-type t1.micro --placement AvailabilityZone=us-west-2a --security-groups quicklaunch-1 --key-name devops --user-data IyEvYmluL2Jhc2gKY2F0ID4+IC92YXIvdG1wL3VzZXItZGF0YS10ZXN0aW5nIDw8RU9GCnRoaXMgaXMgdGVzdCBsaW5lIGFkZGVkIGF0ICQoZGF0ZSkKRU9GCg==

现在,我没有看到文件 /var/tmp/user-data-testing 已创建。

另外,我知道我的 base64 blob 是健康的,因为我可以很好地解码它:

$ base64 --decode <<< IyEvYmluL2Jhc2gKY2F0ID4+IC92YXIvdG1wL3VzZXItZGF0YS10ZXN0aW5nIDw8RU9GCnRoaXMgaXMgdGVzdCBsaW5lIGFkZGVkIGF0ICQoZGF0ZSkKRU9GCg==
#!/bin/bash
cat >> /var/tmp/user-data-testing <<EOF
this is test line added at $(date)
EOF

但是,我确实看到实例元数据包含我的 base64 格式的用户数据:

$ curl -L http://169.254.169.254/latest/user-data/
IyEvYmluL2Jhc2gKY2F0ID4+IC92YXIvdG1wL3VzZXItZGF0YS10ZXN0aW5nIDw8RU9GCnRoaXMgaXMgdGVzdCBsaW5lIGFkZGVkIGF0ICQoZGF0ZSkKRU9GCg==

那么,我在使用 base64 用户数据 blob 时做错了什么?

我的实例元数据知道它,但它似乎在实例启动时并没有真正被执行(或解码和执行)。

更新:

如果我在启动实例时通过 AWS 控制台传递相同的 base64 blob,它可以工作。因此,我与AWS-CLI 一起使用它的方式似乎有问题。

更新:

我刚刚用我的 ruby​​ 代码尝试了相同的 base64 blob,如下所示,效果也很好:

ec2 = Aws::EC2.new
resp = ec2.run_instances(
    min_count: 1,
    max_count: 1,
    image_id: 'ami-8635a9b6',
    instance_type: 't1.micro',
    placement: {
      availability_zone: 'us-west-2a'
    },
    security_groups: ['quicklaunch-1'],
    key_name: 'devops',
    user_data: 'IyEvYmluL2Jhc2gKY2F0ID4+IC92YXIvdG1wL3VzZXItZGF0YS10ZXN0aW5nIDw8RU9GCnRoaXMgaXMgdGVzdCBsaW5lIGFkZGVkIGF0ICQoZGF0ZSkKRU9GCg=='
)

那么,我对AWS-CLI 的实现是错误的?

【问题讨论】:

  • 对于我的个人信息,你是如何编码你的 bash 文件的?作为整个文件还是只是其中的文本?

标签: amazon-web-services amazon-ec2 base64 aws-cli


【解决方案1】:

好像 awscli 为你做了 base64 编码,所以你应该将未编码的文本传递给 --user-data。

显然文档对此不是很清楚。检查这个link

那么这个语法应该是:

aws ec2 run-instances --image-id ami-8635a9b6 --user-data "echo TEST"

aws ec2 run-instances --image-id ami-8635a9b6 --user-data file://path/to/file

【讨论】:

【解决方案2】:

遇到了同样的问题,非常沮丧地追查问题,终于让它工作了。 没有 base64 编码确实将脚本放入文件中。

放置似乎很重要,仅当 --用户数据文件://路径 放在最后

这种格式显然有效地将一些数据更改为您的

aws ec2 run-instances --image-id amisomthing --count 1 --instance-type t1.micro --key-name keysomthing --security-group-ids somegroup --subnet-id somesubnetid --associate-public-ip-address --user-data file://someuserdata

【讨论】:

    【解决方案3】:

    根据文档http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html,base64 仅用于 API 调用而不是 CLI

    【讨论】:

      【解决方案4】:

      AWS documentation - User data and the AWS CLI

      示例:在启动时指定用户数据 要在启动实例时指定用户数据,请使用带有 --user-data 参数的 run-instances > 命令。通过运行实例,AWS CLI >为您执行用户数据的 base64 编码。

      aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \
      --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \
      --user-data echo user data
      

      以下示例显示如何使用文本文件指定脚本。请务必使用 file:// 前缀来指定文件。

      aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \
      --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \
      --user-data file://my_script.txt
      

      Luis 前面已经提到过,应该会被授予正确答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-04
        • 2020-01-17
        • 2015-09-07
        • 2015-09-06
        • 2016-06-01
        • 1970-01-01
        • 2022-01-15
        • 2021-06-12
        相关资源
        最近更新 更多