Введение
Ваша команда хочет останавливать сервер отчётов на время обслуживания и возвращать его в работу с предсказуемым публичным адресом. Вы будете управлять инстансом 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. После ещё одного цикла обслуживания вы проверили доступ к приложению через сохранённый адрес. Наконец, освободили адрес и завершили сервер, подтвердив удаление обоих ресурсов.



