Восстановите файлы из снимка EBS

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

Введение

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

Вы уже должны знать, как создавать, подключать, форматировать и монтировать том данных EBS. Эта независимая среда предоставляет собственный образ, сеть и пару ключей и не использует ресурсы предыдущей лабораторной.

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

Резервное копирование и восстановление с помощью снимков закрепляют понятия хранения из задачи 3.6 целей домена 3 AWS Certified Cloud Practitioner CLF-C02.

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

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

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

cd /home/labex/project
source launch.env

Запустите один экземпляр с именем recovery-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=recovery-server}]'

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

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=recovery-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, выберите recovery-server и нажмите Check application. Подтвердите HTTP 200 перед добавлением хранилища.

Подготовьте исходный отчёт

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

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=source-report}]' \
  --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 выберите recovery-server и нажмите Read volume report. Подтвердите HTTP 200 и текст CSV period,total и Q1,320. Этот ответ показывает, что приложение может прочитать файл со смонтированного тома.

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

Создайте согласованный снимок

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

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

Подключитесь к экземпляру:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Размонтируйте исходную файловую систему, чтобы завершить запись и прекратить доступ к ней:

sudo umount /srv/reports

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

exit

Создайте снимок исходного тома. Сохраните его идентификатор и присвойте метку report-backup:

SNAPSHOT_ID=$(aws ec2 \
  create-snapshot \
  --volume-id "$VOLUME_ID" \
  --description 'Report before accidental deletion' \
  --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=report-backup}]' \
  --query 'SnapshotId' \
  --output text)

Создание снимка выполняется асинхронно. Дождитесь его завершения:

aws ec2 \
  wait snapshot-completed \
  --snapshot-ids "$SNAPSHOT_ID"

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

aws ec2 \
  describe-snapshots \
  --snapshot-ids "$SNAPSHOT_ID" \
  --query 'Snapshots[].{Snapshot:SnapshotId,State:State,SourceVolume:VolumeId}'

Подтвердите completed и ожидаемый исходный том. Обновите AWS View, чтобы проверить снимок. Вы проверите его содержимое восстановлением после намеренного удаления файла.

Наблюдайте последствия случайного удаления файла

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

Подключитесь снова и повторно смонтируйте исходный том:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"
sudo mount /dev/xvdf /srv/reports

Удалите только синтетический файл, созданный для этого упражнения:

sudo rm /srv/reports/report.csv

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

exit

В AWS View выберите recovery-server и нажмите Read volume report. Запрос по-прежнему должен возвращать HTTP 200, но report теперь равен null. Приложение работает, но нужный файл отсутствует. Это позволяет отличить проблему с содержимым хранилища от остановленного сервера.

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

Восстановите новый том из снимка

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

Восстановление создаёт новый том, а не отменяет изменения существующего. Создайте замену в зоне доступности экземпляра, используя завершённый снимок. Официальное руководство по восстановлению описывает этот процесс замены:

RESTORED_VOLUME_ID=$(aws ec2 \
  create-volume \
  --availability-zone "$AVAILABILITY_ZONE" \
  --snapshot-id "$SNAPSHOT_ID" \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=recovered-report}]' \
  --query 'VolumeId' \
  --output text)

Дождитесь готовности:

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

Подключите его как второе устройство данных:

aws ec2 \
  attach-volume \
  --volume-id "$RESTORED_VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdg
aws ec2 \
  wait volume-in-use \
  --volume-ids "$RESTORED_VOLUME_ID"

Проверьте связь нового тома со снимком:

aws ec2 \
  describe-volumes \
  --volume-ids "$RESTORED_VOLUME_ID" \
  --query 'Volumes[].{Volume:VolumeId,State:State,Snapshot:SnapshotId}'

Подтвердите in-use и сохранённый идентификатор снимка. Подключитесь для переключения монтирования приложения:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Размонтируйте исходную файловую систему:

sudo umount /srv/reports

Проверьте восстановленное устройство, представленное в этой лабораторной как /dev/xvdg:

sudo lsblk -f /dev/xvdg

Оно уже содержит файловую систему ext4, скопированную из резервной копии. Не форматируйте это устройство: форматирование перезапишет восстановленные данные. Смонтируйте существующую файловую систему в каталог отчётов приложения:

sudo mount /dev/xvdg /srv/reports

Подтвердите активный источник:

findmnt /srv/reports

Найдите /dev/xvdg. Прочитайте восстановленный отчёт:

cat /srv/reports/report.csv

Ожидаются исходные две строки: period,total и Q1,320. Вернитесь в терминал LabEx:

exit

В AWS View нажмите Refresh resources, выберите recovery-server и нажмите Read volume report. Подтвердите HTTP 200 и исходный текст CSV. Успешная проверка восстановления доказывает, что резервная копия содержит пригодные для приложения данные.

Удалите ресурсы восстановления

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

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

ssh -F ssh_config ubuntu@"$PUBLIC_IP"
sudo umount /srv/reports
exit

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

aws ec2 \
  detach-volume \
  --volume-id "$RESTORED_VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdg
aws ec2 \
  wait volume-available \
  --volume-ids "$RESTORED_VOLUME_ID"

Исходная файловая система размонтирована при восстановлении. Отключите и её том:

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 "$RESTORED_VOLUME_ID"
aws ec2 \
  delete-volume \
  --volume-id "$VOLUME_ID"

Удалите резервную копию упражнения после проверки восстановления:

aws ec2 \
  delete-snapshot \
  --snapshot-id "$SNAPSHOT_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}'

Выведите тома и резервную копию упражнения по их именам:

aws ec2 \
  describe-volumes \
  --filters Name=tag:Name,Values=source-report,recovered-report \
  --query 'Volumes[].VolumeId'
aws ec2 \
  describe-snapshots \
  --filters Name=tag:Name,Values=report-backup \
  --query 'Snapshots[].SnapshotId'

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

Итоги

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