使用 AWS CLI 的 DynamoDB Scan

aws dynamodb scan 會自動分頁,這很方便,同時也表示你用來判斷損害程度的那個數字,預設就是錯的。什麼時候該完全避開這個操作,請見 Query 與 Scan 的比較

程式碼

aws dynamodb scan \
  --table-name 'Music' \
  --filter-expression '#filter0 >= :filterValue0' \
  --expression-attribute-names '{"#filter0":"Year"}' \
  --expression-attribute-values '{":filterValue0":{"N":"2010"}}'

--return-consumed-capacity 回報的是一頁,不是整次掃描

測試資料是 600 首各約 3.9 KB 的歌曲,其中 8 首符合條件。在那個指令加上 --return-consumed-capacity TOTAL,CLI 印出:

{ "Count": 8, "ScannedCount": 600, "CU": 128.5 }

這次掃描實際上跨三頁花了 284.5 個讀取單位。CountScannedCount 是三頁加總的;ConsumedCapacity 則只取了第一頁,其餘直接丟掉。與其說這是 bug,不如說是一條明訂的規則 — botocore 的 DynamoDB 分頁器設定把 CountScannedCount 列為結果鍵,把 ConsumedCapacity 列為非彙總鍵。

破綻在於:工作量沒變,那個數字卻會變。同一張資料表、同樣讀了 600 筆項目,只多加一個旗標:

--page-size 50  ->  { "Count": 8, "ScannedCount": 600, "CU": 24.0 }

如果你要用一次 CLI 掃描來估算資料表容量,請用 --page-size 搭配 --starting-token 自己把每頁加總,或是從 CloudWatch 讀取容量。

--max-items 不會讓掃描停下來

--max-items 3 讀起來像是一次便宜的抽樣。它不是:

--max-items 3  ->  { "Count": 8, "ScannedCount": 600 }

CLI 會一直要下一頁,直到湊夠符合條件的項目為止 — 而在一個選擇性很高的過濾條件下,那意味著整張資料表 — 然後才把印出來的清單截短。它自己的續傳 token 大聲地說明了這件事:

{"ExclusiveStartKey": {"Artist": {"S": "Arturo Sandoval"},
 "SongTitle": {"S": "Cubano Chant 0541"}}, "boto_truncate_amount": 3}

boto_truncate_amount 是一個用戶端的計數器。要限制 DynamoDB 實際讀多少,請用 --page-size,它會替每一次底層請求設定 API 的 Limit,再用 --starting-token 續傳:

aws dynamodb scan \
  --table-name 'Music' \
  --page-size 500 \
  --max-items 100 \
  --starting-token "$NEXT_TOKEN"

已於 2026-07-28 以 aws-cli/2.36.9 對照 DynamoDB Local(amazon/dynamodb-local)實測。上方的 JSON 是 CLI 自己的輸出,只用 --query 重新整形以配合版面寬度。

說明

  • --filter-expression 是在讀取之後才執行的,所以它縮小的是輸出,不是帳單。#filter0 透過 --expression-attribute-names 代表 Year,因為 Year 是保留字。
  • --expression-attribute-values 要求數字被引號包兩層:外層是 shell 對 JSON 的引號,內層是把值寫成 JSON 字串。少了內層引號根本到不了 DynamoDB — CLI 會在本機就拒絕它,訊息是 Invalid type for parameter ExpressionAttributeValues.:v.N, value: 2010, type: <class 'int'>, valid types: <class 'str'>
  • --page-size 才是會改變 API 呼叫的那個旗標。它會成為每一次底層請求的 Limit,限制每頁評估的項目數。分頁家族的其他成員(--max-items--starting-token)都只是 CLI 在管理自己的輸出。
  • 平行掃描需要每個工作者各自帶 --segment N --total-segments M,而且每個工作者要維護自己的 --starting-token。它買到的是牆鐘時間,不是容量。

改用視覺化操作

DynamoDB Expression Builder 會輸出過濾條件與兩張 JSON 對應表,而且已經替 shell 跳脫好,省掉那層讓 CLI 運算式在 DynamoDB 看到之前就失敗的引號問題。

想用 GUI 探索資料表,並使用可過濾、可分頁的表格,請下載 DynoTable,而不是在終端機裡盲目掃描。

相關指南

參考資料

以視覺化方式建構此請求

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

開啟 DynamoDB 查詢建構器

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

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

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