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

Удаление обоих экземпляров и ручного снимка
На этом этапе вы удалите каждый использованный ресурс восстановления.
Удалите восстановленный и исходный учебные экземпляры:
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.



