用 AWS CLI 執行 DynamoDB BatchGetItem
aws dynamodb batch-get-item 會在一條指令中,依主索引鍵取回最多 100 個項目。在命令列上,有兩點讓它跟 query 和 scan 不一樣:索引鍵是巢狀的 DynamoDB JSON,你得先撐過 shell 的引號地獄;而且 CLI 不會替你把 UnprocessedKeys 抽乾。相關限制與部分結果的規則,請見 DynamoDB 的批次操作。
程式碼
aws dynamodb batch-get-item \
--request-items '{
"Music": {
"Keys": [
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "A Mis Abuelos"}},
{"Artist": {"S": "Ella Fitzgerald"}, "SongTitle": {"S": "Misty"}}
]
}
}'簡化之後,輸出會把每張資料表對應到找到的項目,加上任何剩下沒處理的。完整逐字原文的執行結果在本頁下方:
{
"Responses": {
"Music": [
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}, ...}
]
},
"UnprocessedKeys": {}
}說明
- 這條指令在 CLI 裡沒有任何分頁機制。
aws dynamodb query help會列出--starting-token、--max-items與--page-size;aws dynamodb batch-get-item help三個都沒有。UnprocessedKeys不是分頁 token,CLI 把這次呼叫當成一次性的,所以把它抽乾是你 shell 迴圈的工作,不是某個旗標的工作。 - 那份剩餘對應表本身就已經是輸入格式。非空的
UnprocessedKeys可以原封不動地餵回--request-items,完全不需要重塑結構,這也是 bash 裡那個while迴圈還算能忍受的原因。每次嘗試之間請睡一下;立刻重跑只會打到同一個被節流的分割區。 ProjectionExpression與ConsistentRead要放在每張資料表各自的物件裡,跟"Keys"並排。把它們放到--request-items的最上層,是這裡最常見的結構錯誤。- 把那份對應表放進檔案。
--request-items file://keys.json完全避開了 shell 引號問題,而且一旦索引鍵超過寥寥數個,它就是唯一合理的選項。它也正是你會在毫無察覺的情況下撞上 100 個索引鍵上限的方式。
這條指令實際會印出什麼
上面那段程式碼,在三首歌都存在的 DynamoDB Local 3.3.0 上逐字執行(aws-cli/2.36.9):
{
"Responses": {
"Music": [
{
"Artist": {"S": "Arturo Sandoval"},
"AlbumTitle": {"S": "Danzon"},
"Year": {"N": "1994"},
"SongTitle": {"S": "A Mis Abuelos"}
},
{
"Artist": {"S": "Ella Fitzgerald"},
"AlbumTitle": {"S": "Ella in Berlin"},
"Year": {"N": "1960"},
"SongTitle": {"S": "Misty"}
},
{
"Artist": {"S": "Arturo Sandoval"},
"AlbumTitle": {"S": "Danzon"},
"Year": {"N": "1994"},
"SongTitle": {"S": "Cubano Chant"}
}
]
},
"UnprocessedKeys": {}
}(每個屬性對應表各自折成一行,其餘皆為原樣輸出。)這條指令第一個要的是 Cubano Chant,卻最後才拿到它。回應裡沒有任何東西跟位置有關,所以一個去索引 .Responses.Music[0] 的 jq 運算式,讀到的是服務當下高興先回哪一個項目。請改成用索引鍵屬性來過濾。
有兩種請求它會直接回絕,印到 stderr 並以結束狀態 254 收場:
aws: [ERROR]: An error occurred (ValidationException) when calling the BatchGetItem operation: Provided list of item keys contains duplicates
aws: [ERROR]: An error occurred (ValidationException) when calling the BatchGetItem operation: Too many items requested for the BatchGetItem callaws: [ERROR]: 這個前綴是 CLI v2 的外包裝;它後面的文字才是服務自己的訊息。一個把任何非零結束碼都當成節流的重試迴圈,遇到這兩者中的任一個都會永遠空轉,所以在退避之前,請先依訊息分支判斷。
大部分錯誤的來源,都是在單引號裡手寫那段巢狀 JSON。DynamoDB Expression Builder 會組出型別化的索引鍵對應表,並複製出一條可直接執行的指令,至少能把引號問題從嫌疑名單裡剔除。
想把一組索引鍵讀回來、直接看到項目而不必繞 JSON 一圈,請下載 DynoTable。
相關範例
- Node.js 中的 DynamoDB BatchGetItem — 用 AWS SDK v3 做同一種批次讀取。
- Python 中的 DynamoDB BatchGetItem — 用 boto3 做同一種批次讀取。
- 用 AWS CLI 執行 DynamoDB GetItem — 被它批次化的單一項目讀取。
- DynamoDB 的批次操作 — 限制、部分失敗,以及批次划算的時機。
- 「Too many items requested for the BatchGetItem call」 — 一次請求裡超過 100 個索引鍵。
- 「Provided list of item keys contains duplicates」 — 同一批次裡出現兩次同一個索引鍵。
參考資料
- BatchGetItem — Amazon DynamoDB API Reference
- batch-get-item — AWS CLI Command Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。