Храните файлы приложения на томе EBS

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

Введение

Приложению отчётов нужен отдельный диск для файла отчёта. Вы создадите том Amazon EBS, подключите его к экземпляру EC2, отформатируете и смонтируете файловую систему и предоставите отчёт с этого тома. Затем вы размонтируете и отключите том и удалите созданные ресурсы.

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

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

Эта лабораторная позволяет отработать выбор блочного хранилища для рабочей нагрузки EC2 и закрепляет понятия хранения из задачи 3.6 целей домена 3 AWS Certified Cloud Practitioner CLF-C02.

Запустите сервер хранения

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

Начните в рабочем каталоге и загрузите предоставленные идентификаторы ресурсов:

cd /home/labex/project
source launch.env

Запустите один экземпляр с именем storage-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 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=storage-server}]'

Получите идентификатор экземпляра по тегу имени:

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

Дождитесь перехода экземпляра в состояние работы:

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

Зона доступности — изолированное расположение внутри региона. Том EBS подключается к экземпляру в той же зоне доступности. Запросите зону экземпляра, а не пытайтесь её угадать:

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

Проверьте состояние и зону:

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

Убедитесь, что состояние — running. Откройте AWS View, нажмите Refresh resources, выберите storage-server и нажмите Check application. Подтвердите HTTP 200 перед добавлением хранилища.

Создайте и подключите том данных

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

Amazon EBS предоставляет блочное хранилище для EC2. Том — ресурс, подобный диску, а файловая система организует файлы на этом диске. Подключение тома делает его блочное устройство доступным, но не создаёт файловую систему. Руководство по томам EBS описывает подключение и сохранение томов.

Создайте небольшой пустой SSD-том общего назначения. gp3 задаёт тип тома, --size 1 запрашивает один GiB, а переменная зоны размещает его в одной зоне с экземпляром. Сохраните его идентификатор для дальнейших операций:

VOLUME_ID=$(aws ec2 \
  create-volume \
  --availability-zone "$AVAILABILITY_ZONE" \
  --size 1 \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=report-data}]' \
  --query 'VolumeId' \
  --output text)

Дождитесь доступности нового тома:

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Подключите его с именем устройства API /dev/sdf:

aws ec2 \
  attach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

Дождитесь подключения:

aws ec2 \
  wait volume-in-use \
  --volume-ids "$VOLUME_ID"

Проверьте том и его подключение:

aws ec2 \
  describe-volumes \
  --volume-ids "$VOLUME_ID" \
  --query 'Volumes[].{Volume:VolumeId,State:State,Zone:AvailabilityZone,Size:Size,Type:VolumeType,Attachments:Attachments}'

Подтвердите in-use, размер 1, тип gp3 и подключение к вашему экземпляру. Обновите AWS View и проверьте строку тома. Корневой том отличается от нового тома данных.

Смонтируйте том и предоставьте отчёт

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

Получите текущий публичный адрес экземпляра:

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

Подключитесь с помощью предоставленной конфигурации SSH:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Внутри экземпляра проверьте недавно подключённое устройство. Его имя Linux в этой лабораторной — /dev/xvdf; имена устройств могут отличаться от имени подключения API. Другие образы EC2 могут использовать имена NVMe, поэтому определите диск перед операциями с ним. Официальное руководство по подготовке томов Linux объясняет это различие.

lsblk -f /dev/xvdf

Убедитесь, что у устройства нет типа файловой системы. Создайте файловую систему ext4 только на этом новом пустом томе данных. Форматирование тома с существующими данными удалило бы их:

sudo mkfs.ext4 /dev/xvdf

Точка монтирования — каталог, через который вы обращаетесь к файловой системе. Смонтируйте новую файловую систему в подготовленный каталог приложения отчётов:

sudo mount /dev/xvdf /srv/reports

Подтвердите исходное устройство, файловую систему и точку монтирования:

findmnt /srv/reports

Найдите /dev/xvdf, ext4 и /srv/reports. Создайте CSV-отчёт с синтетическими данными. sudo tee записывает в файловую систему, принадлежащую администратору; here-document с разделителем в кавычках сохраняет две строки:

sudo tee /srv/reports/report.csv <<'CSV'
period,total
Q1,320
CSV

Прочитайте файл снова:

cat /srv/reports/report.csv

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

exit

В AWS View выберите storage-server и нажмите Read volume report. Подтвердите HTTP 200 и текст CSV period,total и Q1,320. Этот ответ показывает, что приложение может прочитать файл со смонтированного тома.

Монтирование в этой лабораторной выполняется вручную. Перезагрузка не восстанавливает ручное монтирование автоматически; в рабочих системах обычно настраивают UUID файловой системы в /etc/fstab после проверки записи.

Размонтируйте, отключите и удалите

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

Сначала снова подключитесь к экземпляру приложения:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Размонтируйте файловую систему перед отключением диска. Это прекращает доступ к файловой системе и записывает ожидающие записи на диск:

sudo umount /srv/reports

Подтвердите, что файловая система больше не смонтирована:

findmnt /srv/reports

Для несмонтированного каталога findmnt не выводит данные и возвращает ненулевой код завершения; здесь это ожидается. Вернитесь в терминал LabEx:

exit

Отключите только свой том данных:

aws ec2 \
  detach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

Дождитесь, когда том снова станет доступным:

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Удалите отключённый том. Это навсегда удаляет его данные, поэтому сохраните важные файлы или резервную копию перед удалением тома рабочей системы:

aws ec2 \
  delete-volume \
  --volume-id "$VOLUME_ID"

Завершите экземпляр приложения:

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, затем выведите оставшиеся тома:

aws ec2 \
  describe-volumes \
  --query 'Volumes[].{Volume:VolumeId,State:State}'

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

Итоги

Вы создали том данных EBS в той же зоне доступности, что и экземпляр EC2, подключили его, отформатировали пустую файловую систему и смонтировали её для приложения. Вы проверили реальный ответ с отчётом, затем размонтировали, отключили и удалили том перед завершением сервера.