Aws ec2 run-экземпляры: baseob-кодированный пользовательский BLOB-код игнорируется
Мои кодированные пользователем данные base64 игнорируются при выполнении команды aws ec2 run-instances
.
Вот мои данные пользователя:
$ cat user-data.sh
#!/bin/bash
cat >> /var/tmp/user-data-testing <<EOF
this is test line added at $(date)
EOF
здесь base64 blob выше script:
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==
Итак, что я делаю неправильно в использовании blob-данных пользователя base64?
Мои метаданные экземпляра знают об этом, но похоже, что они не выполняются (или декодируются и исполняются) во время запуска экземпляра.
UPDATE:
Если я передаю тот же base64 blob через AWS Console при запуске экземпляра, он работает. Кажется, что-то не так в том, как я использую его вместе с AWS-CLI
.
UPDATE:
Я просто попробовал тот же base64 blob с моим кодом ruby, как показано ниже, и он тоже работал:
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
?
Ответы
Ответ 1
Кажется, что awscli кодирует base64 для вас, поэтому вы должны передавать некодированный текст в -ser-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
Ответ 2
Если бы одна и та же проблема, очень расстраивая, чтобы отследить проблему, наконец-то заставила ее работать.
не base64 закодированный сделал класть script в файл.
Похоже, что размещение важно для меня, только когда
Файл -ser-data://путь
помещается в конце
Этот формат работал, очевидно, изменил некоторые данные на ваш
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