如何把 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-vs-Scan 成本。大型資料表也意味著要透過LastEvaluatedKey分頁;請見分頁。- 它不是原子的。 在掃描進行期間寫入的項目可能被遺漏 — 只有在 來源處於靜止狀態時,你才能得到一致的快照。
最適合小型資料表,或當你需要在複製過程中轉換/過濾資料時。
做法 2:匯出到 S3,再匯入到新資料表
對於大型資料表,DynamoDB 的受管理匯出到 S3 外加從 S3 匯入完全 不會猛烈消耗你的容量。
匯出會把資料表快照到 S3 儲存桶 (運作方式):
- 要求來源資料表已啟用時間點還原(PITR)。
- 不會消耗讀取容量,且對資料表效能無影響 — 它讀的是持續備份,不是即時資料表。
- 輸出 DynamoDB JSON 或 Amazon Ion 格式。(落地到 S3 的是 DynamoDB-JSON 線路格式,連型別標記一併保留。)
- 可寫入由另一帳號擁有且位於不同區域的 S3 儲存桶。
- 支援完整與增量匯出(增量匯出於 2023 年 9 月 GA)。
匯入接著從那份 S3 資料建立一張全新的資料表 (運作方式):
- 只能匯入到全新的資料表 — 你無法匯入到既有資料表。
- 在新資料表上不會消耗寫入容量。
- 接受 CSV、DynamoDB JSON 或 Amazon Ion(可選 GZIP/ZSTD 壓縮)。
- 來源 S3 儲存桶可位於另一帳號或另一區域。
- 你可以在匯入時定義次要索引,匯入一完成即可查詢。
當你能接受時間點快照(而非即時資料)時,這是大型跨帳號/跨區域 遷移最乾淨的路徑。
做法 3:AWS Backup 複製+還原
如果你已經在用 AWS Backup,它會跨帳號與跨區域複製還原點 (跨帳號遷移指南):
- 把來源資料表備份到備份保存庫。
- 將備份複製到目標帳號/區域的保存庫。
- 把它還原到目標中的新資料表。
關鍵限制:
- 跨帳號複製要求兩個帳號都在同一個 AWS Organization內。
- 還原一律建立新資料表 — 你無法覆蓋既有資料表。
- 全域次要索引預設會被保留(可排除部分或全部以節省 還原時間/成本);你無法在還原時新增索引。
- 加密陷阱: 要在跨區域還原時保留相同的 KMS 金鑰,你需要一把 多區域金鑰;跨帳號時則必須把該金鑰分享給目標 帳號。AWS 擁有與 AWS 受管理的金鑰無法被分享或做成多區域 (還原加密注意事項)。
做法 4:全域資料表(即時複寫,非一次性複製)
全域資料表會跨區域複寫資料表 — 而現在也可選跨帳號 (多帳號於 2026 年 2 月 GA)— 持續地進行。任何複本都能服務讀取與寫入(多活躍),採用非同步、 最後寫入者勝出的複寫 (全域資料表文件)。
這不是「複製後就不管」的工具 — 它是持續的複寫。當你想讓 目的地區域無限期保持同步時(DR、低延遲的就近讀取)才用它, 而不是用於乾淨的一次性遷移。對既有資料表新增一個區域,DynamoDB 就會 把既有資料回填到新複本。
操作陷阱(所有做法)
- 重建 GSI 並非免費。 scan+write 的複製不會帶上索引 — 你要在目標上 定義它們,而它們會分開回填(並產生成本)。請在事前規劃你 在目的地的 GSI vs LSI 配置;LSI 只能在 建立資料表時建立 (LSI 文件)。
- 容量模式不會轉移。 新資料表會以你設定的模式起步, 而非來源的。在做 scan+write 複製前先評估寫入負載 — 用 項目大小計算器估一個有代表性的項目大小, 再乘以項目數,就能粗估 WCU。
- TTL、串流、自動擴展與標籤是資料表設定,不是資料 — 沒有任何一種複製方法會帶上全部。請在目標上重新套用它們。
- DynamoDB JSON ≠ 純 JSON。 匯出與掃描會吐出帶型別標記的 DynamoDB-JSON;如果你在中途做轉換, DynamoDB JSON 轉換器能處理 marshalling。
常見問題
有 AWS CLI 命令可以複製 DynamoDB 資料表嗎?
沒有。沒有原生的 copy-table 命令。你要組合 scan + batch-write-item,
或使用受管理的匯出/匯入或 AWS Backup 功能。
我要如何把 DynamoDB 資料表複製到另一個帳號? 三個選項:一個持有兩個帳號憑證的 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,在遷移期間檢視跨帳號與 跨區域的資料表。