Одним из решений, которое работает очень хорошо и не требует прямого подключения к экземпляру, является использование пользовательских данных в качестве ловушки для «установки» файлов из версии файла (ов) base64.
Мы можем фактически встроить файлы как строки base64 в сценарии инициализации пользовательских данных. Это работает как для экземпляров Windows, так и для Linux в AWS, и совместимо также с выполнением сценария пользовательских данных при запуске.
Решение Описание:
- Во время
terraform plan
, кодируйте любой локальный кодфайлы, которые вам нужны как строки base64 с использованием функций terraform base64encode(file("path/to/file"))
. - (необязательно). Сохраните файл маркера (
_INIT_STARTED_
) в начале выполнения пользовательских данных;этот файл будет иметь метку времени создания, когда началось выполнение userdata
. - Перед запуском сценария userdata actual запишите строки base64 в текстовые файлы. (Фактическая команда зависит от Windows и Linux, см. Примеры ниже.)
- Запустите сам скрипт
userdata
(userdata_win.bat
или userdata_lin.sh
) - (Необязательно) Наконец, сохранитевторой файл маркера (_INIT_COMPLETE_), который будет иметь метку времени создания после завершения сценария
userdata
. (Отсутствие этого файла также полезно для обнаружения ошибок сценариев и / или все еще работающих сценариев после входа в экземпляр.)
Для экземпляров AWS Linux:
data "template_file" "userdata_lin" {
template = <<EOF
#!/bin/bash
mkdir -p /home/ubuntu/setup-scripts
cd /home/ubuntu/setup-scripts
touch _INIT_STARTED_
echo ${base64encode(file("${path.module}/userdata_lin.sh"))} | base64 --decode > userdata.sh
echo ${base64encode(file("${path.module}/config.json"))} | base64 --decode > config.json
${file("${path.module}/userdata_lin.sh")}
sudo chmod 777 *
touch _INIT_COMPLETE_
EOF
}
# ...
resource "aws_instance" "my_linux_instance" {
# ...
user_data = data.template_file.userdata_lin.rendered
}
Для экземпляров AWS Windows:
data "template_file" "userdata_win" {
template = <<EOF
<script>
mkdir C:\Users\Administrator\setup-scripts
cd C:\Users\Administrator\setup-scripts
echo "" > _INIT_STARTED_
echo ${base64encode(file("${path.module}/userdata_win.bat"))} > tmp1.b64 && certutil -decode tmp1.b64 userdata.bat
echo ${base64encode(file("${path.module}/config.json"))} > tmp2.b64 && certutil -decode tmp2.b64 config.json
${file("${path.module}/userdata_win.bat")}
echo "" > _INIT_COMPLETE_
</script>
<persist>false</persist>
EOF
}
# ...
resource "aws_instance" "my_windows_instance" {
# ...
user_data = data.template_file.userdata_win.rendered
}