Цель состоит в том, чтобы создать AMI, который конечный пользователь может настроить, включив внешнюю базу данных или другую конфигурацию конкретного экземпляра.
Я создал собственный образ, который извлекает некоторые ресурсы из репо как часть сборки Packer, а затем создает службу, которая запускает сценарий при следующей загрузке. Когда я запускаю экземпляр из этого AMI, я включаю сценарий пользовательских данных, который просто создает файл опоры, а затем отображает некоторые значения в файле опоры. Затем служебный скрипт создает файл опоры из пользовательских данных, если он существует, или из значений по умолчанию, а затем запускает ресурсы с этими реквизитами.
Однако после запуска экземпляра файл не создается пользовательскими данными. Я нашел кое-что, в котором говорится, что это запускается один раз для каждого идентификатора экземпляра, но это новый экземпляр.
Я попытался получить пользовательские данные как часть служебного сценария wget http://169.254.169.254/latest/user-data
, удалив файлы состояния, связанные с пользовательскими данными, как часть процесса сборки упаковщика, поэтому user_data будет запускаться снова при создании экземпляра AMI, rm -Rf /var/lib/cloud/*
, добавляя пользователя data с #cloud-boothook
, чтобы он запускался каждый раз, а не только при первой загрузке. Однако файл tmp из сценария пользовательских данных отсутствует, и ресурсы начинаются только со значениями по умолчанию.
Упаковщик build.json
...
{
"type": "file",
"source": "../scripts/bootstrap.sh",
"destination": "/tmp/bootstrap.sh"
},
{
"type": "file",
"source": "../scripts/myservice.service",
"destination": "/tmp/myservice.service"
},
{
"type": "shell",
"environment_vars": [
"REPO_USERNAME={{user `repo_user`}}",
"REPO_PASSWORD={{user `rep_password`}}"
],
"execute_command": "echo 'packer' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
"inline": [
"cd /tmp",
"chmod +x bootstrap.sh",
"./bootstrap.sh"
]
}
...
bootstrap.sh
<pull assets>
...
mv /tmp/myservice.service /lib/systemd/system/myservice.service
sudo systemctl enable myservice.service
...
myservice.service
if [ -ne ./user_data_retrieved_flag ]
then
wget http://169.254.169.254/latest/user-data
touch user_data_retrieved_flag
fi
if [ -e ./user-data ] && [ -ne ./user_data_processed_flag ]
then
chmod 755 ./user-data
./user-data
touch user_data_processed_flag
fi
if [ -e /tmp/my_props.properties ]
then
cat /tmp/my_props
mv /tmp/my_props /home/ubuntu/my_props
fi
<myResources.start>
...
Terraform
...
resource "aws_instance" "my_instance" {
ami = "${var.my_custom_ami}"
...
user_data = <<EOF
#cloud-boothook
#!/bin/bash
touch /tmp/my_props
echo PROP1=${var.prop1} >> /tmp/my_props
echo PROP2_USER=${var.db_un} >> /tmp/my_props
chown ubuntu:ubuntu /tmp/my_props
chmod 777 /tmp/my_props
EOF
}
...
Изменить: чтобы уточнить, активы запускаются, поэтому я знаю, что служба выполняется успешно. Однако они используют свойства по умолчанию, и ни флаги, упомянутые в configure.sh, ни файл, который должен был быть создан пользовательскими данными, отсутствуют.