RDS 스냅샷에서 주문 복원

AWSBeginner
지금 연습하기

소개

실수로 데이터를 변경하면 주문 애플리케이션은 작동하지만 비즈니스 레코드가 누락될 수 있습니다. 수동 RDS 스냅샷을 만들고 통제된 삭제를 수행한 뒤 새 인스턴스 복원과 애플리케이션 엔드포인트 전환으로 주문을 복구합니다.

먼저 앞선 데이터베이스 및 SQL 실습을 완료하세요. 이 독립 환경은 예제 주문 세 건이 있는 기본 데이터베이스와 연결된 애플리케이션을 제공합니다. 복구를 확인한 뒤 연습용 인스턴스 두 개와 스냅샷을 삭제합니다.

자격증 시험과의 연관성

이 실습은 다음 시험 주제를 위한 기초 실습을 제공합니다.

수동 데이터베이스 스냅샷 생성

이 단계에서는 변경 전에 현재 데이터베이스 데이터를 저장합니다.

DB 스냅샷은 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만 있어야 합니다. 이제 변경된 원본과 복구된 데이터베이스라는 두 독립 인스턴스가 있습니다.

복구된 엔드포인트를 가져와 애플리케이션의 두 호스트 필드를 업데이트합니다.

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에는 두 인스턴스와 복구된 주문이 표시됩니다. 인스턴스를 만들기만 한 것이 아니라 애플리케이션이 복원된 엔드포인트를 사용하고 필요한 레코드를 이용할 수 있어야 복구가 완료됩니다.

스냅샷에는 삭제 전 저장한 데이터가 있습니다. 백업 이후의 변경은 복원 인스턴스에 자동으로 반영되지 않습니다. 복구 계획에는 백업 시점과 애플리케이션 전환 결정이 중요합니다. 애플리케이션이 독립적으로 복원된 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에는 데이터베이스나 수동 스냅샷이 없어야 합니다. 준비된 애플리케이션과 네트워크는 유지하세요.

요약

수동 데이터베이스 스냅샷을 만들고 통제된 삭제를 관찰한 뒤 저장 데이터를 새 인스턴스에 복원했습니다. 애플리케이션 엔드포인트를 바꾸어 원본을 변경하지 않고 누락된 주문을 복구했습니다. 이어서 두 인스턴스와 별도의 수동 스냅샷을 삭제했습니다.

다음 실습에서는 PostgreSQL 읽기 전용 복제본으로 애플리케이션의 읽기와 쓰기를 분리합니다.