🎯 방식 ①: Debezium → MSK(Serverless) → S3(Iceberg) → Athena
🎯 방식 ②: Aurora Native CDC → EventBridge Pipes → Lambda → S3(Iceberg)/Dynamo
🎯 방식 ③: CDC(DMS/Debezium) → EventBridge Pipes → DynamoDB
🎯 방식 ④: Debezium Server on Fargate(Spot) → S3(Iceberg) → Athena
🤖 GPT-5 기반 비용 분석: 이 비교 분석은 GPT-5를 활용하여 5가지 CDC 구현 방식의 상세한 비용 계산과 의사결정 과정을 수행했습니다.
| 월 | 총 쿼리 수 | INSERT | UPDATE | DELETE | CUD 합계 |
|---|---|---|---|---|---|
| 2025-07 | 245,982,101 | 5,886,976 | 2,633,551 | 0 | 8,520,527 |
| 2025-08* | 54,751,948 | 1,277,932 | 545,330 | 0 | 1,823,262 |
*2025-08 데이터는 수집 중 일부 기간만 포함됨
🎯 비용 효율성 비교 (월간 비용):
현재 구현 (Lambda 직접 파싱): $30.58
방식 ④ (Fargate Spot): $90 (+196%)
방식 ① (MSK Serverless): $160 (+423%)
방식 ② (Aurora CDC + Pipes): $260 (+751%)
방식 ③ (DMS + Dynamo): $303 (+892%)
연간 절약 효과: $2,754-3,274 (70-90% 절약)
🎯 기술적 우위:
🎯 성능 최적화:
🎯 확장성:
🎯 비용 효율성
🎯 운영 단순화

graph TB
A[CloudWatch Events<br/>1분마다 트리거] --> B[AWS Lambda<br/>aurora-cdc-parser]
B --> C[Aurora MySQL<br/>Binlog 스트림]
B --> D[DynamoDB<br/>체크포인트 관리]
B --> E[S3 Bucket<br/>JSONL + Parquet]
style A fill:#ff9999
style B fill:#99ccff
style C fill:#99ff99
style D fill:#ffcc99
style E fill:#cc99ff
🎯 데이터 무결성 보장
🎯 처리 효율성

sequenceDiagram
participant L as Lambda
participant D as DynamoDB
participant A as Aurora
participant S as S3
L->>D: 체크포인트 조회
D-->>L: 마지막 위치 반환
L->>A: Binlog 스트림 생성
A-->>L: 이벤트 스트림
loop 10건마다
L->>D: 중간 체크포인트 저장
L->>S: JSONL/Parquet 저장
end
L->>D: 최종 체크포인트 저장

flowchart TD
A[Lambda 시작] --> B[환경 감지]
B --> C[DB 연결 및 설정 검증]
C --> D[체크포인트 조회]
D --> E[서버 ID 생성]
E --> F[Binlog 스트림 생성]
F --> G[이벤트 수집 루프]
G --> H{이벤트 존재?}
H -->|Yes| I[이벤트 변환]
I --> J[스키마 매핑]
J --> K[기본키 추출]
K --> L[10건마다 체크포인트]
L --> M[S3 저장]
M --> G
H -->|No| N[최종 체크포인트]
N --> O[Lambda 종료]
style A fill:#ff9999
style O fill:#99ff99

graph LR
A[Raw Binlog Event] --> B[이벤트 타입 분류]
B --> C[INSERT Event]
B --> D[UPDATE Event]
B --> E[DELETE Event]
C --> F[after_values 추출]
D --> G[before_values + after_values]
E --> H[before_values 추출]
F --> I[스키마 매핑]
G --> I
H --> I
I --> J[기본키 추출]
J --> K[구조화된 이벤트 데이터]
K --> L[JSONL 변환]
K --> M[Parquet 변환]
style A fill:#ffcc99
style K fill:#99ff99
style L fill:#99ccff
style M fill:#cc99ff
s3://aurora-history-binlog/
└── env=dev/db=db-name/schema=schema-name/date=2025-01-15/
└── PUSH_LOG_20250115_143022.parquet
🎯 Parquet 경로: Athena 파티션 최적화
파티션 키 구조:
1. env = 'prod' # 환경별 분리 (dev/stage/prod)
2. db = 'database_name' # 데이터베이스별 분리
3. schema = 'schema_name' # 스키마별 분리
4. date = '2025-09-15' # 날짜별 분리 (가장 세밀한 파티션)
파티션 프루닝 효과:
-- 비효율적인 쿼리 (전체 테이블 스캔)
SELECT * FROM binlog_event
WHERE table_name = 'table_name' AND pk_value = '32811'
-- 최적화된 쿼리 (파티션 프루닝)
SELECT * FROM binlog_event
WHERE env = 'prod' -- 파티션 1: 환경
AND database_name = 'database_name' -- 파티션 2: 데이터베이스
AND schema_name = 'schema_name' -- 파티션 3: 스키마
AND event_date BETWEEN '2025-09-01' AND '2025-09-30' -- 파티션 4: 날짜
AND table_name = 'table_name'
AND pk_value = '32811'
env=prod/db=database_name/schema=table_name/date=2025-09-01/ ← 스캔됨
env=prod/db=database_name/schema=table_name/date=2025-09-02/ ← 스캔됨
...
env=prod/db=database_name/schema=schema_name/date=2025-09-30/ ← 스캔됨
env=prod/db=database_name/schema=schema_name/date=2025-10-01/ ← 스캔 안됨 (범위 밖)
env=dev/db=database_name/schema=schema_name/date=2025-09-15/ ← 스캔 안됨 (환경 다름)