11

运行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=='
)

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

4

4 回答 4

20

似乎 awscli 为您进行了 base64 编码,因此您应该将未编码的文本传递给 --user-data。

显然,文档对此不是很清楚。检查此链接

这个语法应该是:

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
于 2014-03-13T19:44:10.817 回答
1

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

仅当 --user-data file://path 放在最后时,放置似乎对我很重要

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

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
于 2014-11-28T19:16:16.520 回答
0

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

于 2015-12-22T19:12:28.853 回答
0

AWS 文档 - 用户数据和 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之前已经提到过这一点,应该被授予正确的答案。

于 2021-09-11T08:35:16.787 回答