aws ec2 run-instances:忽略base64编码的用户数据blob

时间:2014-03-12 06:52:50

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

运行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

的实施是错误的

3 个答案:

答案 0 :(得分:19)

似乎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

答案 1 :(得分: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

答案 2 :(得分:0)

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