Управлять жизненным циклом и адресами инстанса

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

Введение

Ваша команда хочет останавливать сервер отчётов на время обслуживания и возвращать его в работу с предсказуемым публичным адресом. Вы будете управлять инстансом EC2, сравнивать остановленное и работающее состояния, связывать Elastic IP и проверять приложение после ещё одного цикла остановки и запуска.

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

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

Операции с инстансами и публичная адресация поддерживают вычислительные и сетевые понятия задач 3.3 и 3.5 целей домена 3 AWS Certified Cloud Practitioner CLF-C02.

Запустить сервер для обслуживания

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

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

cd /home/labex/project

Загрузите предоставленные ID образа, подсети и группы безопасности:

source launch.env

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

cat lifecycle-user-data.sh

Найдите сообщение Lifecycle server. Как и в предыдущей работе, --user-data file://... читает Bash-скрипт и передаёт его инстансу при запуске. Создайте сервер с именем lifecycle-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://lifecycle-user-data.sh \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=lifecycle-server}]'

Сохраните ID инстанса из запроса по тегу имени для следующих операций:

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

Проверьте его состояние и сетевые адреса:

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

Подтвердите running; если состояние ещё pending, немного подождите и повторите запрос. Запомните частный и публичный IPv4-адреса из вывода. После обслуживания вы их сравните.

Откройте AWS View и нажмите Refresh resources. Выберите lifecycle-server в Application requests, затем нажмите Check application. Подтвердите HTTP 200 и Lifecycle server до изменения состояния инстанса.

Остановить сервер для обслуживания

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

Инстанс stopped выключен и может быть запущен снова. Инстанс terminated удалён окончательно. У инстанса с корневым хранилищем EBS остановка сохраняет корневой том; приложение недоступно, пока инстанс остановлен. Официальное руководство по жизненному циклу инстанса объясняет эти различия состояний.

Остановите свой инстанс приложения:

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

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

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

Снова проверьте состояние и адреса:

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

Подтвердите stopped. Частный IPv4-адрес сохраняется, а автоматически назначенный публичный IPv4-адрес освобождается. После повторного запуска вам понадобится актуальный публичный адрес.

Обновите AWS View. Подтвердите stopped и отсутствие инстанса в списке работающих приложений. Во время обслуживания сервер недоступен, хотя запись инстанса и корневое хранилище сохраняются.

Сохранить публичный адрес с помощью Elastic IP

На этом шаге вы запустите сервер, свяжете Elastic IP и проверите сохранение связи публичного endpoint после ещё одного цикла остановки и запуска.

Запустите существующий инстанс:

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

Дождитесь running:

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

Проверьте его адреса:

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

ID инстанса и частный IPv4-адрес остаются прежними. Автоматически назначенный публичный адрес меняется после остановки и запуска. Обновите AWS View и снова проверьте приложение; оно должно по-прежнему возвращать Lifecycle server.

Elastic IP — публичный IPv4-адрес, выделенный вашему аккаунту до его освобождения. Выделение резервирует адрес; связывание подключает его к инстансу или сетевому интерфейсу. Он может обеспечивать стабильный адрес после остановки и запуска, как описано в официальном руководстве Elastic IP.

Выделите один Elastic IP для использования в VPC и сохраните ID выделения:

ALLOCATION_ID=$(aws ec2 \
  allocate-address \
  --domain vpc \
  --query 'AllocationId' \
  --output text)

Свяжите это выделение с инстансом. Сохраните возвращённый ID связи для удаления ресурсов:

ASSOCIATION_ID=$(aws ec2 \
  associate-address \
  --allocation-id "$ALLOCATION_ID" \
  --instance-id "$INSTANCE_ID" \
  --query 'AssociationId' \
  --output text)

Проверьте адрес и связанный с ним инстанс:

aws ec2 \
  describe-addresses \
  --allocation-ids "$ALLOCATION_ID" \
  --query 'Addresses[].{PublicIPv4:PublicIp,Allocation:AllocationId,Instance:InstanceId}'

Запомните Elastic IP. Он заменяет автоматически назначенный публичный IPv4-адрес инстанса. Обновите AWS View и проверьте приложение, чтобы убедиться, что новый адрес ведёт на тот же сервер.

Теперь выполните ещё один цикл обслуживания:

aws ec2 \
  stop-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-stopped \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  start-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

Проверьте инстанс ещё раз:

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

Убедитесь, что публичный адрес по-прежнему совпадает с записанным Elastic IP. Обновите AWS View и нажмите Check application. HTTP 200 с Lifecycle server подтверждает, что после обслуживания сервер отвечает через сохранённый адрес.

Освободить адрес и завершить сервер

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

Удаление связи разрывает соединение адреса с инстансом. Оно не освобождает адрес из вашего аккаунта. Сначала удалите сохранённую связь:

aws ec2 \
  disassociate-address \
  --association-id "$ASSOCIATION_ID"

Затем освободите выделенный адрес:

aws ec2 \
  release-address \
  --allocation-id "$ALLOCATION_ID"

Выделенные публичные IPv4-адреса остаются оплачиваемыми ресурсами AWS, даже если инстанс остановлен. Освобождение ненужного адреса — часть удаления ресурсов.

Завершите сервер:

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

Дождитесь завершения:

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. Перечислите оставшиеся выделенные Elastic IP:

aws ec2 \
  describe-addresses \
  --query 'Addresses[].{Allocation:AllocationId,PublicIPv4:PublicIp}'

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

Итоги

Вы остановили и запустили сервер приложения EC2, наблюдали изменения адресов и связали Elastic IP. После ещё одного цикла обслуживания вы проверили доступ к приложению через сохранённый адрес. Наконец, освободили адрес и завершили сервер, подтвердив удаление обоих ресурсов.