DynamoDB 테이블을 다른 계정이나 리전으로 복사하는 방법
DynamoDB에는 원클릭 "테이블 복사" 명령이 없습니다 — AWS CLI에도, 콘솔에도 없습니다. 계정이나 리전 간에 테이블을 복사하거나 마이그레이션하려면 네 가지 접근 방식 중 하나를 골라야 하며, 각각 비용, 다운타임, 충실도 면에서 서로 다른 트레이드오프가 있습니다. 이 가이드는 네 가지 모두와, 프로덕션에서 물리는 운영상의 함정까지 다룹니다.
DynamoDB 테이블을 다른 계정이나 리전으로 어떻게 복사하나요?
네이티브 테이블 복사 명령은 없습니다. 네 가지 접근 방식 중 하나를 고르세요: 작은 일회성 복사에는 Scan + BatchWriteItem 스크립트, 큰 테이블에는 S3 내보내기 후 가져오기, 완전한 충실도가 필요한 계정 간 이동에는 AWS Backup 복사 + 복원, 지속적인 실시간 복제에는 글로벌 테이블입니다. 모든 복원 또는 가져오기는 새 테이블을 만듭니다.
| 상황 | 최선의 접근 방식 |
|---|---|
| 작은 테이블, 일회성, 완전한 제어 | Scan + BatchWriteItem 스크립트 |
| 큰 테이블, 스냅샷을 감내할 수 있음 | S3 내보내기 → 가져오기(새 테이블 생성) |
| 복원을 포함한 계정 간 / 리전 간 복사 | AWS Backup 복사 + 복원 |
| 지속적인 실시간 복제(일회성 복사가 아님) | 글로벌 테이블 |
보편적으로 "옳은" 접근 방식은 없습니다 — 테이블 크기, 특정 시점 스냅샷이 필요한지 실시간 데이터가 필요한지, 대상이 새 테이블인지 기존 테이블인지에 따라 달라집니다.
접근 방식 1: Scan + BatchWriteItem(스크립트)
가장 단순한 방식입니다: 소스에서 모든 항목을 Scan으로 읽고, 대상에 BatchWriteItem으로 씁니다.
스크립트가 양쪽 자격 증명을 보유하고 있는 한(또는 대상 계정에서 역할을 가정하는 한) 계정 간, 리전 간
모두 동작합니다.
# 스케치 — 소스를 읽고 대상에 쓰기(의사 코드; 실제로는 SDK를 사용하세요)
aws dynamodb scan --table-name SourceTable --region us-east-1 \
> items.json
# Items[]를 BatchWriteItem RequestItems로 변환한 다음:
aws dynamodb batch-write-item --request-items file://batch.json \
--region eu-west-1함정은 실제로 존재하며 놓치기 쉽습니다:
BatchWriteItem은 호출당 25개 항목 또는 16MB로 제한됩니다 — 청크로 나눠야 하며, 단일 호출이 지수 백오프로 재시도해야 하는 미처리 항목을 반환할 수 있습니다 (API 참조).- 쓰기는 쓰기 용량을 소비합니다. 프로비저닝된 대상에서는 금세
ProvisionedThroughputExceededException에 도달하고, 온디맨드는 더 많이 흡수하지만 그래도 파티션별 소프트 한도가 있습니다. 시작하기 전에 대상의 용량에 맞춰 쓰기 부하를 가늠하세요. Scan은 테이블 전체를 읽고 모든 항목을 과금합니다 — 고전적인 Query 대 Scan 비용입니다. 큰 테이블은LastEvaluatedKey로 페이지를 넘기는 것도 의미합니다. 페이지네이션을 보세요.- 원자적이지 않습니다. 스캔이 진행되는 동안 쓰여진 항목은 누락될 수 있습니다 — 소스가 정지 상태일 때만 일관된 스냅샷을 얻습니다.
작은 테이블이거나 복사 중에 변환/필터링이 필요할 때 가장 좋습니다.
접근 방식 2: S3로 내보낸 다음 새 테이블로 가져오기
큰 테이블의 경우, DynamoDB의 관리형 S3 내보내기와 S3 가져오기는 용량을 전혀 두들기지 않습니다.
내보내기는 테이블을 S3 버킷으로 스냅샷합니다 (동작 방식):
- 소스 테이블에 특정 시점 복구(PITR)가 활성화되어 있어야 합니다.
- 읽기 용량을 소비하지 않으며 테이블 성능에 영향이 없습니다 — 라이브 테이블이 아니라 연속 백업에서 읽기 때문입니다.
- DynamoDB JSON 또는 Amazon Ion 형식을 출력합니다. (DynamoDB-JSON 와이어 형식이 타입 태그까지 포함해 그대로 S3에 도착합니다.)
- 다른 계정이 소유한 S3 버킷이나 다른 리전의 버킷에도 쓸 수 있습니다.
- 전체 및 증분 내보내기를 지원합니다(증분 내보내기 GA, 2023년 9월).
그런 다음 가져오기가 그 S3 데이터로부터 새 테이블을 만듭니다 (동작 방식):
- 완전히 새로운 테이블로만 가져옵니다 — 기존 테이블로는 가져올 수 없습니다.
- 새 테이블에 쓰기 용량을 소비하지 않습니다.
- CSV, DynamoDB JSON, 또는 Amazon Ion을 받습니다(선택적으로 GZIP/ZSTD 압축).
- 소스 S3 버킷은 다른 계정이나 다른 리전에 있을 수 있습니다.
- 가져오기 시점에 보조 인덱스를 정의할 수 있으며, 가져오기가 완료되는 즉시 쿼리할 수 있습니다.
특정 시점 스냅샷(실시간 데이터가 아님)으로 충분한, 큰 규모의 계정 간/리전 간 마이그레이션에 가장 깔끔한 경로입니다.
접근 방식 3: AWS Backup 복사 + 복원
이미 AWS Backup을 사용하고 있다면, 복구 지점을 계정과 리전 간에 복사합니다 (계정 간 마이그레이션 가이드):
- 소스 테이블을 백업 볼트에 백업합니다.
- 백업을 대상 계정/리전의 볼트로 복사합니다.
- 대상에서 새 테이블로 복원합니다.
주요 제약:
- 계정 간 복사는 두 계정이 같은 AWS Organization에 있어야 합니다.
- 복원은 항상 새 테이블을 만듭니다 — 기존 테이블 위에 복원할 수 없습니다.
- 글로벌 보조 인덱스는 기본적으로 보존됩니다(복원 시간/비용을 줄이려면 일부 또는 전부 제외할 수 있음); 복원 시점에 새 인덱스를 추가할 수는 없습니다.
- 암호화 함정: 리전 간 복원에서 같은 KMS 키를 유지하려면 다중 리전 키가 필요하고, 계정 간 복원에서는 키를 대상 계정과 공유해야 합니다. AWS 소유 및 AWS 관리형 키는 공유하거나 다중 리전으로 만들 수 없습니다 (복원 암호화 노트).
접근 방식 4: 글로벌 테이블(실시간 복제, 일회성 복사가 아님)
글로벌 테이블은 테이블을 리전 간에 — 그리고 이제 선택적으로 계정 간에 (다중 계정 GA, 2026년 2월) — 지속적으로 복제합니다. 모든 복제본이 읽기와 쓰기를 처리하며(다중 활성), 비동기적인 후속 쓰기 우선 복제를 사용합니다 (글로벌 테이블 문서).
이것은 "복사하고 떠나는" 도구가 아닙니다 — 지속적인 복제입니다. 깔끔한 일회성 마이그레이션이 아니라, 대상 리전을 무기한 동기 상태로 유지하고 싶을 때(DR, 저지연 로컬 읽기) 사용하세요. 기존 테이블에 리전을 추가하면 DynamoDB가 기존 데이터를 새 복제본으로 백필합니다.
운영상의 함정(모든 접근 방식)
- GSI는 다시 만드는 데 공짜가 아닙니다. 스캔+쓰기 복사는 인덱스를 가져오지 않습니다 — 대상에 직접 정의해야 하고, 인덱스는 별도로 백필되며(비용도) 발생합니다. 대상의 GSI 대 LSI 레이아웃을 미리 계획하세요. LSI는 테이블 생성 시점에만 만들 수 있습니다 (LSI 문서).
- 용량 모드는 이전되지 않습니다. 새 테이블은 소스가 아니라 여러분이 설정한 모드로 시작합니다. 스캔+쓰기 복사 전에 쓰기 부하를 추정하세요 — 대표 항목의 크기를 항목 크기 계산기로 재고 항목 수를 곱해 WCU를 대략 가늠하세요.
- TTL, 스트림, 자동 확장, 태그는 데이터가 아니라 테이블 설정입니다 — 어떤 복사 방법도 이들을 모두 가져오지 않습니다. 대상에서 다시 적용하세요.
- DynamoDB JSON ≠ 일반 JSON. 내보내기와 스캔은 타입 태그가 붙은 DynamoDB-JSON을 내보냅니다. 경로 중간에 변환한다면 DynamoDB JSON 변환기가 마샬링을 처리합니다.
FAQ
DynamoDB 테이블을 복사하는 AWS CLI 명령이 있나요?
아니요. 네이티브 copy-table 명령은 없습니다. scan + batch-write-item을 조합하거나,
관리형 내보내기/가져오기 또는 AWS Backup 기능을 사용합니다.
DynamoDB 테이블을 다른 계정으로 복사하려면 어떻게 하나요? 세 가지 옵션이 있습니다: 양쪽 계정의 자격 증명을 가진 스캔+쓰기 스크립트, S3 내보내기/가져오기(버킷은 계정 간 가능), 또는 AWS Backup 복사+복원(두 계정이 같은 AWS Organization에 있어야 함).
DynamoDB 테이블을 다른 리전으로 복사하려면 어떻게 하나요? S3 내보내기/가져오기와 AWS Backup 모두 리전 간을 지원합니다. 일회성 복사가 아니라 지속적인 리전 간 동기화가 필요하면, 대상 리전에 글로벌 테이블 복제본을 추가하세요.
테이블을 복사하면 인덱스도 복사되나요? S3 가져오기와 AWS Backup 복원은 보조 인덱스를 유지/정의하게 해줍니다. 스캔+쓰기 스크립트는 그렇지 않습니다 — 대상에서 직접 인덱스를 만들어야 하고, 인덱스는 별도로 백필됩니다.
기존 DynamoDB 테이블로 가져올 수 있나요? 아니요. DynamoDB의 S3 가져오기와 AWS Backup 복원은 둘 다 새 테이블을 만듭니다. 기존 테이블에 병합하려면 스캔+쓰기 스크립트를 사용하세요.
GUI는 전환을 합리적으로 만들어 줍니다: 소스와 대상을 나란히 둘러보고, 복사 후 항목 수와 몇 개의 샘플 레코드를 검증하고, 스캔 스크립트를 작성하지 않고도 즉석 점검을 실행할 수 있습니다. DynoTable 다운로드로 마이그레이션 중 계정과 리전을 넘나들며 테이블을 점검하세요.