Я пытаюсь создать сценарий, который будет автоматически развертывать и устанавливать экземпляр AWS EC2 с помощью сценария bash. у меня есть сценарий развертывания это выглядит примерно так:
#!/bin/bash
# Update apt-get
echo Updating apt-get repositories
apt-get update -yqq
# Install pre-requisits
echo Installing AWS CLI and Python 3
apt-get install -yqq awscli python3 python3-pip
# Set timezone to US/Eastern
# https://help.ubuntu.com/community/UbuntuTime
echo "US/Eastern" | sudo tee /etc/timezone
dpkg-reconfigure --frontend noninteractive tzdata
echo cloud-init userdata processed.
Скрипт развертывания (позволяет позвонить userdata.bash
) работает нормально, когда я развертываю экземпляр с помощью аргументов:
aws ec2 run-instances \
--image-id ami-064a0193585662d74 \
--instance-type t3.micro \
--key-name "ssh key" \
--security-group-ids sg-abcdef01 sg-abcdef02 \
--user-data file://userdata.bash
Экземпляр запускается, скрипт запускается, все отлично!
Но когда я помещаю эти же параметры в файл json, часть пользовательских данных не анализируется должным образом.
Файл json с именем launch.json
:
{
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"DeleteOnTermination": true,
"VolumeType": "gp2",
"VolumeSize": 8
}
}
],
"ImageId": "ami-064a0193585662d74",
"InstanceType": "t3.micro",
"KeyName": "ssh key",
"SecurityGroupIds": ["sg-abcdef01", "sg-abcdef02"],
"Placement": {
"AvailabilityZone": "us-east-1a"
},
"IamInstanceProfile": {
"Arn": "arn:aws:iam::111111111111:instance-profile/some-role"
},
"UserData": "file://userdata.bash"
}
Когда я бегу с --cli-input-json
аргумент, все загружается нормально, за исключением сценария userdata.
Я пробовал преобразовать скрипт в base64 и загрузить напрямую, но это не сработало. Я пробовал только имя файла, и это тоже не сработало. Документация похоже, молчит о формате части userdata файла yaml.
Любые предложения будут ценны.
Одна вещь, которая будет работать, - это назначить фактическое содержимое скрипта UserData в файле json и использовать символ новой строки для разделения строк скрипта. Вот тестовый сценарий, который я использовал в качестве примера:
"UserData": "#!/bin/bash\nyum install emacs -y\n",
Это устанавливает emacs на моем экземпляре при запуске. Возможно, что версия в кодировке base64 будет работать, если это одна строка.
Обратите внимание на следующее для целей тестирования:
curl http://169.254.169.254/latest/user-data
чтобы увидеть, как было интерпретировано значение, которое вы передали в UserData. В моем тестировании, если бы я использовал "UserData": "file://userdata.bash"
, то возвращаемое значение было file: //userdata.bash, а не содержимым скрипта.Как вы сказали, это не очень хорошо документировано, и я подозреваю, что есть способ заставить команду читать содержимое файла вместо использования буквального значения, но я нигде не видел, чтобы это было задокументировано.