소개
실수로 데이터를 변경하면 주문 애플리케이션은 작동하지만 비즈니스 레코드가 누락될 수 있습니다. 수동 RDS 스냅샷을 만들고 통제된 삭제를 수행한 뒤 새 인스턴스 복원과 애플리케이션 엔드포인트 전환으로 주문을 복구합니다.
먼저 앞선 데이터베이스 및 SQL 실습을 완료하세요. 이 독립 환경은 예제 주문 세 건이 있는 기본 데이터베이스와 연결된 애플리케이션을 제공합니다. 복구를 확인한 뒤 연습용 인스턴스 두 개와 스냅샷을 삭제합니다.
자격증 시험과의 연관성
이 실습은 다음 시험 주제를 위한 기초 실습을 제공합니다.
- Cloud Practitioner (CLF-C02) · 과제 3.4: 관리형 관계형 데이터베이스와 복구 옵션을 이해합니다.
- Solutions Architect – Associate (SAA-C03) · 과제 2.2: 애플리케이션 데이터베이스의 백업과 복구를 연습합니다.
수동 데이터베이스 스냅샷 생성
이 단계에서는 변경 전에 현재 데이터베이스 데이터를 저장합니다.
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에는 두 인스턴스와 복구된 주문이 표시됩니다. 인스턴스를 만들기만 한 것이 아니라 애플리케이션이 복원된 엔드포인트를 사용하고 필요한 레코드를 이용할 수 있어야 복구가 완료됩니다.
스냅샷에는 삭제 전 저장한 데이터가 있습니다. 백업 이후의 변경은 복원 인스턴스에 자동으로 반영되지 않습니다. 복구 계획에는 백업 시점과 애플리케이션 전환 결정이 중요합니다.

두 인스턴스 및 수동 스냅샷 삭제
이 단계에서는 사용한 복구 리소스를 모두 삭제합니다.
복구된 인스턴스와 원래 연습용 인스턴스를 삭제합니다.
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 읽기 전용 복제본으로 애플리케이션의 읽기와 쓰기를 분리합니다.



