Инициализировать инстанс с помощью User Data

AWSBeginner
Практиковаться сейчас

Введение

Ваша команда хочет, чтобы каждый новый сервер отчётов запускался с правильным приветствием приложения. Вы напишете Bash-скрипт User Data, передадите его при запуске инстанса EC2 и проверите получившееся приложение и журнал запуска.

Вы уже должны уметь запускать инстанс EC2 и подключаться по SSH. Эта новая среда предоставляет собственные образ, сеть и пару ключей; сервер и его конфигурацию запуска создадите вы.

Связь с сертификацией

Сертификация Задача экзамена Практика
AWS Certified Cloud Practitioner (CLF-C02) Задача 3.1 Программная настройка ресурсов и автоматизация запуска.

Обзор лабораторной работы

Обзор: User Data настраивает приложение EC2 при первом запуске; AWS View проверяет приветствие.

Настроить приложение при запуске

На этом шаге вы напишете скрипт запуска, запустите инстанс с этим скриптом и проверите ответ приложения.

В уроке запуска вы вручную изменили один сервер. Сервер на замену должен получать то же приветствие без повторного редактирования через SSH, поэтому вы перенесёте настройку в сценарий первого запуска. Ответ приложения доказывает применение настройки, а журнал запуска помогает объяснить выполнение. User Data и его представление Base64 — читаемая конфигурация, а не хранилище секретов.

User Data — информация, передаваемая инстансу при запуске. Стартовый скрипт Linux может использовать её для автоматической настройки программ. По умолчанию такие скрипты выполняются от имени root при первой загрузке, поэтому их командам не нужен sudo. Официальное руководство EC2 User Data описывает это поведение и расположение журнала.

Пользовательские данные выполняются через cloud-init при первом запуске — Концептуальная схема: Пользовательские данные выполняются через cloud-init при первом запуске.

Начните в рабочем каталоге:

cd /home/labex/project

Подготовленный образ содержит приложение отчётов. Загрузите ID образа и сети в текущую оболочку:

source launch.env

Создайте user-data.sh с помощью here-document. Внешние маркеры SCRIPT ограничивают весь скрипт, а внутренние JSON — конфигурацию приложения. Маркеры в кавычках сохраняют текст буквально. Первая строка #!/bin/bash выбирает Bash, а set -euo pipefail останавливает скрипт при ошибках команд или использовании неопределённых переменных. Последний echo выводит полезную запись в журнал запуска.

cat > user-data.sh <<'SCRIPT'
#!/bin/bash
set -euo pipefail
cat > /etc/report-app/config.json <<'JSON'
{
  "message": "Started with User Data"
}
JSON
echo 'Report application configuration applied.'
SCRIPT

Это создаёт локальный файл и пока не меняет ни один инстанс. Передайте файл в run-instances через --user-data file://user-data.sh. AWS CLI прочитает и закодирует его для API, поэтому самостоятельно кодировать его не нужно. Назовите сервер bootstrap-server:

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --user-data file://user-data.sh \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=bootstrap-server}]'

Сохраните ID нового инстанса. Фильтр выбирает его тег имени, а $(...) получает результат в виде обычного текста:

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=bootstrap-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)
echo "$INSTANCE_ID"

Проверьте состояние и публичный адрес:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,PublicIPv4:PublicIpAddress}'

Убедитесь, что состояние — running. Если оно всё ещё pending, немного подождите и повторите запрос. Работающий инстанс сам по себе не доказывает успешной настройки при запуске; далее вы проверите приложение.

Посмотрите на AWS View вверху, нажмите Refresh resources и выберите bootstrap-server в Application requests. Нажмите Check application. Подтвердите HTTP 200 и сообщение Started with User Data. Вы настроили сервер стартовым скриптом, не редактируя его после запуска.

AWS View показывает HTTP 200 для приложения, настроенного при запуске — Этот пример показывает ожидаемый ответ. ID вашего инстанса и сети будут отличаться.

Получите публичный адрес для подключения по SSH:

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)
echo "$PUBLIC_IP"

Предоставленная конфигурация SSH выбирает закрытый ключ и маршрут доступа лабораторной работы:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Теперь вы внутри инстанса приложения. Прочитайте журнал вывода запуска с правами администратора:

sudo cat /var/log/cloud-init-output.log

Найдите Report application configuration applied. Это вывод переданного вами скрипта. При диагностике сбоя запуска сначала проверьте этот журнал на ошибки команд, затем протестируйте само приложение, не полагаясь только на состояние инстанса.

Вернитесь в терминал LabEx:

exit

Можно также получить User Data, сохранённые на инстансе. Этот запрос выбирает их значение Base64, а конвейер передаёт его в base64 --decode, чтобы показать исходный скрипт:

aws ec2 \
  describe-instance-attribute \
  --instance-id "$INSTANCE_ID" \
  --attribute userData \
  --query 'UserData.Value' \
  --output text | base64 --decode

Убедитесь, что Bash-скрипт и приветствие совпадают с вашим файлом. Обычно User Data выполняются только при первой загрузке; остановка и повторный запуск инстанса не повторяют эту настройку автоматически. Используйте автоматизацию запуска для воспроизводимой начальной настройки и не включайте учётные данные в скрипт.

Завершить инициализированный сервер

На этом шаге вы удалите созданный инстанс и проверите его окончательное состояние.

Завершите только инстанс, указанный в сохранённой переменной:

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

Дождитесь состояния terminated. Waiter периодически запрашивает состояние и при успехе завершает работу без вывода:

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

Подтвердите окончательное состояние:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

Результат должен показывать terminated. Обновите AWS View и убедитесь, что bootstrap-server больше не является работающей целью приложения. Оставьте подготовленные сеть и пару ключей.

Итоги

Вы написали Bash-скрипт User Data и передали его EC2 при запуске. Вы проверили автоматическую настройку приложения через AWS View, изучили журнал вывода запуска и получили сохранённый скрипт. Наконец, вы завершили сервер и подтвердили его окончательное состояние.