Восстановление заказов из снимка RDS

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

Введение

Случайное изменение данных может оставить приложение работающим, но без нужных бизнес-записей. Вы создадите ручной снимок RDS, выполните контролируемое удаление и вернёте заказ, восстановив новый экземпляр и переключив endpoint приложения.

Сначала завершите предыдущие работы о базах и SQL. Независимая среда предоставляет основной экземпляр с тремя заказами и подключённое приложение. После доказательства восстановления вы удалите два учебных экземпляра и снимок.

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

Эта работа даёт начальную практику по следующим темам экзаменов.

  • Cloud Practitioner (CLF-C02) · Задача 3.4: Понять управляемые реляционные базы и способы восстановления.
  • Solutions Architect – Associate (SAA-C03) · Задача 2.2: Практиковать резервное копирование и восстановление базы приложения.

Создание ручного снимка базы

На этом этапе вы сохраните текущие данные перед изменением.

Снимок базы — копия экземпляра RDS для восстановления. Ручной снимок создаётся явно и остаётся отдельным ресурсом до удаления. Эта работа использует один ручной снимок, без настройки автоматического хранения резервных копий или восстановления на момент времени.

Загрузите настройки подключения и проверьте данные приложения:

cd /home/labex/project
source database.env
curl \
  --silent \
  --show-error \
  --fail \
  http://127.0.0.1:8080/application/orders | jq

Ожидаются заказы 101, 102 и 103. Заказ 101 принадлежит Maya и имеет сумму 49.90.

Сохраните снимок базы:

aws rds \
  create-db-snapshot \
  --db-instance-identifier orders-db \
  --db-snapshot-identifier orders-before-delete \
  --query 'DBSnapshot.{Snapshot:DBSnapshotIdentifier,Source:DBInstanceIdentifier,Status:Status}'
aws rds \
  wait db-snapshot-available \
  --db-snapshot-identifier orders-before-delete
aws rds \
  describe-db-snapshots \
  --db-snapshot-identifier orders-before-delete \
  --query 'DBSnapshots[].{Snapshot:DBSnapshotIdentifier,Type:SnapshotType,Source:DBInstanceIdentifier,Status:Status}'

Ожидается ручной снимок orders-db со статусом available. AWS View должен показать его рядом с основным экземпляром. Дождитесь завершения до следующего изменения.

Наблюдение контролируемой потери данных

На этом этапе вы удалите ровно один примерный заказ и увидите результат в приложении.

Следующее удаление намеренно выполняется для упражнения. WHERE ограничивает его заказом 101:

psql \
  "service=orders-db" \
  --set=ON_ERROR_STOP=1 \
  --command 'DELETE FROM orders WHERE order_id = 101;'

Прочитайте оставшиеся строки:

psql \
  "service=orders-db" \
  --command 'SELECT order_id, customer, total FROM orders ORDER BY order_id;'

Ожидаются только 102 и 103. Запросите список приложения:

curl \
  --silent \
  --show-error \
  --fail \
  http://127.0.0.1:8080/application/orders | jq

Приложение по-прежнему подключается и отвечает, но заказ Maya отсутствует. Исправное соединение не доказывает полноту бизнес-данных. Снимок до удаления содержит нужную копию для восстановления.

Восстановление нового экземпляра и переключение приложения

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

Восстановление создаёт новую конечную точку; пунктир сравнивает исходную БД без отката

Концептуальная схема: Восстановление создаёт новую конечную точку; пунктир сравнивает исходную БД без отката.

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

aws rds \
  restore-db-instance-from-db-snapshot \
  --db-instance-identifier orders-restored \
  --db-snapshot-identifier orders-before-delete \
  --db-instance-class db.t3.micro \
  --db-subnet-group-name orders-subnets \
  --vpc-security-group-ids "$DB_SECURITY_GROUP_ID" \
  --no-publicly-accessible \
  --query 'DBInstance.{Identifier:DBInstanceIdentifier,Status:DBInstanceStatus,Endpoint:Endpoint}'
aws rds \
  wait db-instance-available \
  --db-instance-identifier orders-restored

Запросите новый движок через подготовленную запись подключения:

psql \
  "service=orders-restored" \
  --command 'SELECT order_id, customer, total FROM orders ORDER BY order_id;'

Ожидаются все три исходных заказа. Отдельно проверьте источник:

psql \
  "service=orders-db" \
  --command 'SELECT order_id, customer, total FROM orders ORDER BY order_id;'

Он должен по-прежнему содержать только 102 и 103. Теперь есть два независимых экземпляра: изменённый источник и восстановленная база.

Получите восстановленный endpoint и измените оба поля хоста приложения:

RESTORED_ENDPOINT=$(aws rds \
  describe-db-instances \
  --db-instance-identifier orders-restored \
  --query 'DBInstances[0].Endpoint.Address' \
  --output text)
jq \
  --arg host "$RESTORED_ENDPOINT" \
  '.read_host = $host | .write_host = $host' \
  app-config.json > app-config.new
mv app-config.new app-config.json

Проверьте приложение:

curl \
  --silent \
  --show-error \
  --fail \
  http://127.0.0.1:8080/application/orders | jq

Ожидаются снова 101, 102 и 103. AWS View должен показать оба экземпляра и восстановленные заказы. Восстановление завершено, когда приложение использует новый endpoint и нужные записи доступны, а не просто когда создан экземпляр.

Снимок содержит данные, сохранённые до удаления. Изменения после резервного копирования не появляются автоматически в восстановленном экземпляре. При планировании важны время копирования и решение о переключении приложения. Приложение читает восстановленные заказы из независимо восстановленного экземпляра PostgreSQL.

Удаление обоих экземпляров и ручного снимка

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

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

aws rds \
  delete-db-instance \
  --db-instance-identifier orders-restored \
  --skip-final-snapshot \
  --query 'DBInstance.DBInstanceIdentifier'
aws rds \
  delete-db-instance \
  --db-instance-identifier orders-db \
  --skip-final-snapshot \
  --query 'DBInstance.DBInstanceIdentifier'
aws rds \
  wait db-instance-deleted \
  --db-instance-identifier orders-restored
aws rds \
  wait db-instance-deleted \
  --db-instance-identifier orders-db

Ручной снимок независим от экземпляров и тоже требует удаления:

aws rds \
  delete-db-snapshot \
  --db-snapshot-identifier orders-before-delete \
  --query 'DBSnapshot.DBSnapshotIdentifier'

Проверьте оба списка ресурсов:

aws rds \
  describe-db-instances \
  --query 'DBInstances[].DBInstanceIdentifier'
aws rds \
  describe-db-snapshots \
  --snapshot-type manual \
  --query 'DBSnapshots[].DBSnapshotIdentifier'

Ожидается [] в обоих. AWS View не должен показывать баз или ручных снимков. Сохраните подготовленное приложение и сеть.

Итоги

Вы создали ручной снимок, наблюдали контролируемое удаление и восстановили данные в новом экземпляре. Переключение endpoint вернуло отсутствующий заказ, сохранив источник без изменений. Затем вы удалили оба экземпляра и отдельный снимок.

Следующая работа разделит чтение и запись приложения с помощью реплики чтения PostgreSQL.