以 AWS CLI 取出 DynamoDB 的所有項目

AWS CLI 把分頁藏了起來。aws dynamodb scan 會依資料表所需,發出多次 1 MB 的服務呼叫,並印出一份合併後的結果,所以讀十個項目的命令和讀一千萬個項目的命令是同一個命令。

那既是它的方便之處,也是陷阱。呼叫次數、記憶體與帳單都會隨資料表成長,而那一行始終只有一行。

程式碼

aws dynamodb scan --table-name 'Music'

合併後的輸出裝著資料表中的每一個項目:

{
    "Items": [
        {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}, ...}
    ],
    "Count": 1287,
    "ScannedCount": 1287
}

說明

  • --no-paginate 是那個只呼叫一次的開關 — 它會讓 CLI 停止追著游標跑,所以你拿到第一頁,別無其他。看一眼可以,做完整讀取就錯了(游標如何運作)。
  • --page-size 改變的是呼叫次數,不是輸出 — AWS 說得很直白:"Changing the page size doesn't affect the output; it affects only the number of API calls that need to be made to generate the output."。當一個大頁面逾時的時候才動它,絕不是為了省錢。兩種方式的讀取成本完全一樣。
  • --max-items 是輸出停下、NextToken 開始的地方 — 它會印出那麼多個項目,外加一個給 --starting-token 用的續讀 token。把它和 --page-size 設成同一個數字:AWS 警告說取值不同"can get unexpected results with missing or duplicated items"。
  • --query 是在你的機器上跑的 — 它是套用在已印出結果上的 JMESPath,而那是在每個項目都已經被讀取並計費之後才套用的。--projection-expression(再加上給保留字用的 --expression-attribute-names)才是 DynamoDB 看得到的那一個,而它縮小的是回應,不是帳單。--filter-expression 同樣是在項目被收費之後才把它們丟掉(帶過濾條件的 Scan)。
  • 一切都會先緩衝,然後遇上分頁器 — CLI 會在列印前累積每一頁,而 CLI v2 預設在 macOS 與 Linux 上把結果送進 less、在 Windows 上送進 more。在一張大資料表上,那同時是一次記憶體尖峰與一個卡住的終端機。加上 --no-cli-pager,或把 AWS_PAGER 設成空字串,再用 --max-items 切片。
  • 平行 scan 從 shell 也做得到 — 用 --segment i --total-segments N 跑 N 份,各自對自己的分片自動分頁。總成本相同,牆鐘時間低得多(何時值得這麼做)。

改用視覺化操作

一行命令也可能是一個昂貴的命令。DynamoDB 定價計算機會在你執行之前,替完整讀取你的資料表標上一個數字。

DynoTable 是在一個格線中翻閱資料表,而不是在終端機緩衝區裡,並且能把那個格線背後的 Scan 匯出成一個 aws dynamodb 命令。下載 DynoTable

相關範例

參考資料

最後查證於 2026-07-28,對照上方連結的官方 AWS 文件。

以視覺化方式建構此請求

在免費的 DynamoDB 查詢建構器中組合此操作 — 鍵條件、Filter、Index、Limit、排序方向與分頁迴圈 — 再把它複製成可執行的 SDK v3、CLI 或 boto3 程式。

開啟 DynamoDB 查詢建構器

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。