기준: DVA-C02 시험 가이드오류 제보
이번 주는 AWS의 데이터 계층 3대 축 — RDS, ElastiCache, Aurora — 를 통과했다. 각각이 다른 문제를 풀고, 다른 trade-off를 가진다는 걸 봤다. RDS는 관계형 DB의 운영 부담을 AWS에 위임하는 1세대 관리형 DB, Aurora는 그 한 단계 위에서 스토리지·복제 레이어를 클라우드 네이티브로 재설계한 2세대, ElastiCache는 그 둘 위에서 인메모리 캐시 계층을 제공하는 보완재다.
DVA-C02 시험의 데이터 영역 문제는 정해진 틀이 있다. "이런 요구사항(가용성, latency, 비용, 확장성, 일관성)이 주어졌을 때 어느 서비스를 어떻게 구성하나"를 시나리오로 묻는다. 오늘은 이번 주 내용을 시나리오 중심으로 다시 묶고, 12문항의 실전 시나리오로 종합 점검한다.
production에서 데이터 계층을 결정할 때 거치는 사고 흐름은 다음 5단계다. 시험 시나리오 분석에도 그대로 적용된다.
1단계: 데이터 모델
└─ 관계형(JOIN, 트랜잭션 필요) → RDS / Aurora
└─ 키-값 (단일 entity 조회 위주) → DynamoDB / ElastiCache
└─ 문서·시계열·그래프 등 → DocumentDB / Timestream / Neptune
2단계: 일관성 요구
└─ Strong consistency (ACID 필요) → RDS / Aurora / MemoryDB
└─ Eventual consistency 허용 → DynamoDB / ElastiCache Replica
3단계: latency 요구
└─ μs (마이크로초) → ElastiCache / MemoryDB / DAX
└─ ms (밀리초 한 자리) → Aurora primary / DynamoDB
└─ 수 ms ~ 수십 ms → RDS / Aurora Replica / S3
4단계: 가용성·DR 요구
└─ Single AZ OK → 기본 RDS Single-AZ
└─ AZ 장애 자동 복구 (RTO 분 단위) → RDS Multi-AZ
└─ Cross-region DR (RTO 분 단위) → Aurora Global / DynamoDB Global Tables
5단계: 비용 모델
└─ 안정 트래픽 → Reserved Instance (~50-70% 절감)
└─ 변동 트래픽 → Aurora Serverless v2 / DynamoDB On-Demand
└─ 개발/스테이징 → Single-AZ + Reserved (or Serverless auto-pause)
| 서비스 | 메커니즘 | 페일오버 시간 | RPO |
|---|---|---|---|
| RDS Multi-AZ Instance | 블록 동기 복제 (1 standby) | 60-120초 | ~0 |
| RDS Multi-AZ Cluster | 동기 quorum (2 readable standby) | 35초 이하 | ~0 |
| ElastiCache Redis Multi-AZ | Primary-Replica + sentinel | 60초 이하 | replica lag |
| Aurora Multi-AZ | 6 사본 quorum | 30초 이하 | ~0 |
| Aurora Global Database | redo log shipping (cross-region) | 수 분 (managed failover) | 1초 미만 |
| 서비스 | 메커니즘 | 최대 개수 | 복제 lag |
|---|---|---|---|
| RDS Read Replica | binlog/WAL 비동기 | 15 (MySQL/PG/MariaDB) | 초 ~ 분 |
| ElastiCache Redis Replica | Redis replication | 5 per shard | ms |
| Aurora Replica | redo log 알림 (공유 스토리지) | 15 | 보통 100ms보다 훨씬 짧음 |
| 도구 | 보호 대상 | 회전 | RDS 호환 |
|---|---|---|---|
| AWS KMS | 데이터 암호화 키 | 자동 (1년) | ✅ at-rest |
| Secrets Manager | 비밀번호, API 키 | 자동 (Lambda 또는 native) | ✅ |
| IAM DB Authentication | 비밀번호 자체 제거 | N/A (15분 토큰) | ✅ MySQL/PG |
| Parameter Store | 일반 설정값 (SecureString도 가능) | 수동 | △ (가능하지만 회전 없음) |
헷갈리기 쉬운 함정을 모았다.
⚠️ 함정 예시 1 — 자동 백업 보존 기간 0일: 자동 백업을 "끄고 싶다"는 의도로 보존 기간을 0일로 설정하면 그 순간 PITR이 불가능해지고 Read Replica 생성도 막힌다. 시험 문제: "Read Replica 생성 시도가 실패하는 원인은?" → 자동 백업 비활성화. 해결책: 보존 기간 1일 이상으로 설정.
⚠️ 함정 예시 2 — Aurora vs RDS Read Replica 최대 개수: Aurora 클러스터는 Aurora Replica 최대 15개이고, RDS도 MySQL/PostgreSQL/MariaDB/SQL Server는 소스당 최대 15개다. Oracle은 엔진별 문서를 따른다. 시험에서 "RDS Read Replica 최대 개수"라는 단순 문제가 나오면 엔진을 보고 답해야 한다.
| 시나리오 키워드 | 답 |
|---|---|
| "Lambda + RDS + connection 폭증" | RDS Proxy |
| "비밀번호 자동 회전 + 무중단" | Secrets Manager rotation |
| "비밀번호 자체를 코드에서 제거" | IAM DB Authentication |
| "DROP TABLE 즉시 복구 (Aurora MySQL)" | Backtrack |
| "DROP TABLE 어제 데이터 복구" | PITR |
| "DB 삭제 후에도 백업 유지" | 수동 스냅샷 / Final Snapshot |
| "쿼리 wait event 분석" | Performance Insights |
| "OS 프로세스 단위 모니터링" | Enhanced Monitoring |
| "리더보드/순위 캐싱" | Redis Sorted Set |
| "여러 EC2 인스턴스 간 세션 공유" | ElastiCache Redis |
| "DynamoDB 캐시" | DAX |
| "글로벌 RDBMS + 1초 미만 lag" | Aurora Global Database |
| "글로벌 NoSQL + 멀티 마스터" | DynamoDB Global Tables |
| "간헐적 RDB 트래픽 + 자동 확장" | Aurora Serverless v2 |
| "PII 저장 + 감사 로그 1년" | Audit log → CloudWatch Logs + KMS |
| "랜섬웨어 방어 백업" | AWS Backup Vault Lock (WORM) |
| "Multi-AZ인데 standby에서 읽고 싶다" | Multi-AZ Cluster Deployment |
| "Aurora replica 부하 한 노드에만 몰림" | DNS TTL/connection 유지 문제, RDS Proxy 또는 cluster-aware client |
| "CA 인증서 만료로 connection 실패" | RDS CA rotation, 트러스트 스토어 갱신 |
| "마이크로초 latency + DB 수준 durability" | MemoryDB for Redis |
Production 서울:
Aurora MySQL Multi-AZ
├── Writer endpoint → OLTP 트래픽
├── Reader endpoint → 일반 read
└── Custom endpoint (큰 인스턴스 2개) → 분석 워크로드 격리
DR 도쿄:
Aurora Global Database secondary
└── Read-only, region 내 latency 최소화
└── Primary region 다운 시 promote (RTO 수 분)
캐시 계층:
ElastiCache Redis Cluster Mode Enabled (서울)
├── 세션 데이터
├── 인기 상품 정보 (Lazy Loading + TTL 5분)
└── 리더보드 (Sorted Set)
비밀 관리:
Secrets Manager + RDS Proxy (Lambda function 측)
KMS CMK로 스토리지/스냅샷/Secrets 모두 암호화
이 한 구성에 이번 주 개념 대부분이 들어간다.
Phase 1 (MVP):
RDS MySQL Single-AZ db.t3.micro + 로컬 in-memory 캐시 (라이브러리)
Phase 2 (트래픽 증가):
RDS MySQL Multi-AZ db.t3.medium + ElastiCache Redis (세션, 인기 데이터)
Phase 3 (확장):
Aurora MySQL Multi-AZ + Aurora Replica 3개 + ElastiCache Redis Cluster
RDS Proxy 도입 (Lambda 함수가 늘어남에 따라)
Phase 4 (글로벌):
Aurora Global Database (서울 + 도쿄)
CloudFront + S3 static asset CDN
ElastiCache Replica를 각 region에
- RDS at-rest 암호화 (KMS CMK, 회사 소유 키)
- TLS 강제 (rds.force_ssl=1)
- IAM DB Auth + Secrets Manager (인간 사용자는 IAM, 애플리케이션은 Secrets Manager + RDS Proxy)
- Audit log → CloudWatch Logs (KMS 암호화) → 1년 보존 → S3 archive
- AWS Backup Vault Lock으로 백업 WORM 보호
- VPC private subnet only, NAT Gateway 없음 (egress 차단)
- CloudTrail 데이터 이벤트 활성화
HIPAA, PCI-DSS, ISO 27001 같은 인증을 받는 환경에서 쓰는 구성 예시다.
| 옵션 | 약정 기간 | 비용 절감 |
|---|---|---|
| On-Demand | 없음 | 0% (기준) |
| 1년 Standard RI No Upfront | 1년 | 약 30% |
| 1년 Standard RI All Upfront | 1년 | 약 38% |
| 3년 Standard RI All Upfront | 3년 | 약 60% |
| Aurora Serverless v2 (안정 트래픽) | 없음 | -20% (오히려 비쌈) |
| Aurora Serverless v2 (간헐 트래픽) | 없음 | 50-80% (사용 안 할 땐 0 ACU) |
"비용 최적화" 시나리오에서는 트래픽 패턴이 안정적이면 Reserved Instance, 변동적이면 Serverless가 답이다. 변동의 기준은 "사용량이 시간대별로 5배 이상 차이" 정도로 보며, 그 미만이면 RI가 유리하다.
# RDS 생성 (Multi-AZ + 암호화 + IAM 인증)
aws rds create-db-instance \
--db-instance-identifier prod-mysql \
--db-instance-class db.r6g.large \
--engine mysql --master-username admin \
--master-user-password "$(aws secretsmanager get-random-password --output text --query RandomPassword)" \
--allocated-storage 100 --storage-type gp3 \
--multi-az --storage-encrypted \
--enable-iam-database-authentication \
--backup-retention-period 14 \
--enable-cloudwatch-logs-exports '["audit","error","general","slowquery"]'
# Aurora Cluster 생성 (Global Database 준비)
aws rds create-global-cluster --global-cluster-identifier my-global \
--engine aurora-mysql
aws rds create-db-cluster --db-cluster-identifier my-primary \
--engine aurora-mysql --global-cluster-identifier my-global \
--master-username admin --master-user-password ...
aws rds create-db-instance --db-instance-identifier my-primary-instance \
--db-cluster-identifier my-primary --db-instance-class db.r6g.large \
--engine aurora-mysql
# Secondary region에 추가
aws rds create-db-cluster --region us-east-1 \
--db-cluster-identifier my-secondary \
--engine aurora-mysql --global-cluster-identifier my-global
# ElastiCache Redis Cluster Mode Enabled
aws elasticache create-replication-group \
--replication-group-id prod-cache \
--replication-group-description "production cache" \
--engine redis --cache-node-type cache.r7g.large \
--num-node-groups 3 --replicas-per-node-group 2 \
--automatic-failover-enabled --multi-az-enabled \
--at-rest-encryption-enabled --transit-encryption-enabled \
--auth-token "$(aws secretsmanager get-random-password ...)"
# RDS Proxy 생성
aws rds create-db-proxy \
--db-proxy-name my-proxy \
--engine-family MYSQL \
--auth '[{"AuthScheme":"SECRETS","SecretArn":"arn:aws:secretsmanager:..."}]' \
--role-arn arn:aws:iam::123456789012:role/rdsproxyrole \
--vpc-subnet-ids subnet-aaa subnet-bbb \
--require-tls이번 주 내용은 두 가지로 압축된다.
다음 주는 NoSQL — DynamoDB — 로 넘어간다. DynamoDB는 RDS와 거의 정반대 철학(샤딩 자동, 강일관성 옵션, 무제한 확장, 관계형 모델 포기)을 가진 서비스다. 이번 주 RDS/Aurora를 이해하면 DynamoDB의 "왜 그렇게 다르게 설계됐나"가 훨씬 잘 보인다.
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
한 SaaS 회사가 production RDS MySQL을 운영 중이다. Lambda 함수 500개가 burst 트래픽 시 동시 호출되어 "Too many connections" 에러가 발생하고, 동시에 보안팀이 "비밀번호를 코드에 두지 말 것 + 자동 회전 + connection 안정성" 세 요구를 모두 요구한다. 가장 적절한 구성은?
문제 2
한 핀테크 회사가 다음을 모두 만족하는 RDS 구성을 원한다: ① RPO ≈ 0 ② standby에서 분석 쿼리 실행 가능 ③ 페일오버 시간 < 60초. 가장 적합한 옵션은?
문제 3
ElastiCache Redis Cluster Mode Enabled에서 한 핫 키(인기 상품 ID)에 트래픽이 집중되어 한 샤드의 CPU가 100%이고 다른 샤드는 5%다. 가장 효과적인 해결책은?
문제 4
한 회사가 Aurora MySQL을 사용 중인데, 개발자가 production DB에 DELETE FROM orders WHERE created_at > '2024-01-01'를 실수로 실행했다. 가장 빠른 복구 방법은? (사고 직후 30분 이내)
문제 5
한 게임 회사가 글로벌 사용자를 대상으로 실시간 리더보드를 운영한다. 다음 요구를 모두 만족해야 한다: ① 1억 명 점수 정렬 ② 특정 유저 순위 조회 < 10ms ③ 점수 업데이트 초당 10만 회. 가장 적합한 구성은?
문제 6
한 의료 SaaS가 RDS PostgreSQL에 PHI(Protected Health Information)를 저장한다. HIPAA 감사 요건상 ① 저장 데이터 KMS 회사 키 암호화 ② TLS 강제 ③ "누가 어떤 쿼리를 실행했는지" 1년 보존 ④ 백업 WORM 보호. 누락된 것 한 가지는 무엇인가? 다음 중 적용해야 할 항목을 모두 선택:
(A) pgaudit extension 활성화 + CloudWatch Logs export
(B) rds.force_ssl=1 파라미터
(C) KMS CMK(고객 관리 키)로 인스턴스 암호화
(D) AWS Backup Vault Lock 활성화
문제 7
한 e-commerce가 Aurora MySQL에 ElastiCache Redis로 상품 정보 캐싱을 구현했다. Lazy Loading + 1시간 TTL을 사용. 그런데 운영팀이 "상품 가격을 변경해도 1시간 동안 옛 가격이 보인다"고 보고한다. 가장 적절한 해결책은?
문제 8
한 회사가 Aurora MySQL을 도쿄에서 운영 중이다. 글로벌 사용자가 늘면서 미국·유럽에서도 read latency가 50ms 이하여야 하고, 도쿄 region 다운 시 자동으로 다른 region으로 promote 가능해야 한다. 적절한 구성은?
문제 9
한 스타트업이 개발/스테이징 환경 RDS 비용을 줄이려 한다. 평일 9-18시만 사용하고 주말과 야간엔 사용하지 않는다. 가장 비용 효율적인 구성은?
문제 10
한 회사가 Multi-AZ RDS MySQL을 운영 중이다. 마이너 패치가 자동 실행되면서 평일 오전 트래픽 피크 시 4분 다운타임이 발생했다. 향후 같은 사고를 방지하는 방법으로 적절하지 않은 것은?
문제 11
한 회사가 ElastiCache Redis를 사용 중인데, 노드 한 대가 갑자기 다운되면서 캐시 전체가 비고, 그 순간 RDS로 트래픽이 폭증해 RDS까지 다운되는 cascading failure를 겪었다. 향후 같은 사고를 방지하는 가장 적절한 구성은?
문제 12
다음 시나리오 중 DAX(DynamoDB Accelerator)가 답이 아닌 경우는?