DynamoDB テーブルを別のアカウントやリージョンにコピーする方法
DynamoDB には ワンクリックの「テーブルコピー」コマンドはありません — AWS CLI にも、 コンソールにもありません。アカウントやリージョンをまたいでテーブルをコピー・移行するには、 4つのアプローチのいずれかを選ぶことになり、それぞれコスト、ダウンタイム、忠実度のトレードオフが 異なります。このガイドは4つすべてに加え、本番で噛みついてくる運用上の落とし穴も扱います。
DynamoDB テーブルを別のアカウントやリージョンにコピーするには?
ネイティブの「テーブルコピー」コマンドはありません。4つのアプローチのいずれかを選びます。小さな一度きりのコピーには 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は1回の呼び出しで25項目または16MB が上限 — チャンク化する必要があり、 1回の呼び出しが未処理項目を返すことがあり、指数バックオフで再試行する必要があります (API リファレンス)。- 書き込みは書き込みキャパシティを消費します。 プロビジョンドのターゲットでは
ProvisionedThroughputExceededExceptionにすぐ当たります。オンデマンドはより多くを吸収しますが、 それでもパーティションごとのソフトリミットがあります。開始前に宛先のキャパシティに対して 書き込み負荷を見積もってください。 Scanはテーブル全体を読み、すべての項目を計量します — 古典的な Query-vs-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 の再作成は無料ではありません。 scan+write のコピーはインデックスを運びません — ターゲットで それらを定義し、バックフィルさせる(そしてコストがかかる)ことになります。宛先での GSI vs LSIレイアウトを事前に計画してください。LSI はテーブル作成時にのみ 作成できます (LSI ドキュメント)。
- キャパシティモードは転送されません。 新しいテーブルはソースのではなく、あなたが設定した モードで始まります。scan+write のコピー前に書き込み負荷を見積もり — 項目サイズ計算機で代表的な項目のサイズを測り、 項目数を掛けて WCU を概算してください。
- TTL、ストリーム、オートスケーリング、タグは、データではなくテーブル設定です — どの コピー手法もそれらをすべて運ぶわけではありません。ターゲットで再適用してください。
- DynamoDB JSON ≠ プレーン JSON。 エクスポートとスキャンは型タグ付きの DynamoDB-JSONを出力します。途中で変換するなら、 DynamoDB JSON コンバーターがマーシャリングを扱います。
FAQ
DynamoDB テーブルをコピーする AWS CLI コマンドはありますか?
いいえ。ネイティブの copy-table コマンドはありません。scan + batch-write-item を
組み合わせるか、マネージドのエクスポート/インポートまたは AWS Backup 機能を使います。
DynamoDB テーブルを別のアカウントにコピーするには? 3つの選択肢です。両アカウントの認証情報を持つ scan+write スクリプト、S3 エクスポート/インポート(バケットはクロスアカウントでよい)、または AWS Backup のコピー+復元 (両アカウントが同じ AWS Organization にある必要あり)。
DynamoDB テーブルを別のリージョンにコピーするには? S3 エクスポート/インポートと AWS Backup はどちらもクロスリージョンをサポートします。一度きりの コピーではなく継続的なクロスリージョン同期には、対象リージョンにグローバルテーブルのレプリカを 追加します。
テーブルをコピーするとインデックスもコピーされますか? S3 インポートと AWS Backup の復元では、セカンダリインデックスを保持/定義できます。scan+write スクリプトでは違います — ターゲットでインデックスを自分で作成し、別途バックフィルされます。
既存の DynamoDB テーブルにインポートできますか? いいえ。DynamoDB の S3 インポートと AWS Backup の復元はどちらも 新しい テーブルを作成します。 既存テーブルにマージするには、scan+write スクリプトを使ってください。
GUI は切り替えを正気に保ちます。ソースとターゲットを並べて参照し、コピー後に項目数と いくつかのサンプルレコードを検証し、スキャンスクリプトを書かずにアドホックなチェックを実行できます。 DynoTable をダウンロードして、移行中にアカウントやリージョンをまたいで テーブルを調べてください。