Назад | Перейти на главную страницу

Как установить пользовательские данные при использовании аргумента AWS CLI --cli-input-json?

Я пытаюсь создать сценарий, который будет автоматически развертывать и устанавливать экземпляр 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 будет работать, если это одна строка.

Обратите внимание на следующее для целей тестирования:

  1. После запуска, если вы подключаетесь к своему экземпляру с помощью SSH, вы можете использовать curl http://169.254.169.254/latest/user-data чтобы увидеть, как было интерпретировано значение, которое вы передали в UserData. В моем тестировании, если бы я использовал "UserData": "file://userdata.bash", то возвращаемое значение было file: //userdata.bash, а не содержимым скрипта.
  2. Вы также можете проверить файл /var/log/boot.log на наличие сообщений, связанных с вашим скриптом пользовательских данных.
  3. Вы также можете проверить значение пользовательских данных через консоль через действия-> настройки экземпляра-> просмотреть / изменить пользовательские данные.

Как вы сказали, это не очень хорошо документировано, и я подозреваю, что есть способ заставить команду читать содержимое файла вместо использования буквального значения, но я нигде не видел, чтобы это было задокументировано.