用 AWS CLI 執行 DynamoDB BatchGetItem

aws dynamodb batch-get-item 會在一條指令中,依主索引鍵取回最多 100 個項目。在命令列上,有兩點讓它跟 queryscan 不一樣:索引鍵是巢狀的 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-sizeaws dynamodb batch-get-item help 三個都沒有。UnprocessedKeys 不是分頁 token,CLI 把這次呼叫當成一次性的,所以把它抽乾是你 shell 迴圈的工作,不是某個旗標的工作。
  • 那份剩餘對應表本身就已經是輸入格式。非空的 UnprocessedKeys 可以原封不動地餵回 --request-items,完全不需要重塑結構,這也是 bash 裡那個 while 迴圈還算能忍受的原因。每次嘗試之間請睡一下;立刻重跑只會打到同一個被節流的分割區。
  • ProjectionExpressionConsistentRead 要放在每張資料表各自的物件裡,跟 "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 call

aws: [ERROR]: 這個前綴是 CLI v2 的外包裝;它後面的文字才是服務自己的訊息。一個把任何非零結束碼都當成節流的重試迴圈,遇到這兩者中的任一個都會永遠空轉,所以在退避之前,請先依訊息分支判斷。

大部分錯誤的來源,都是在單引號裡手寫那段巢狀 JSON。DynamoDB Expression Builder 會組出型別化的索引鍵對應表,並複製出一條可直接執行的指令,至少能把引號問題從嫌疑名單裡剔除。

想把一組索引鍵讀回來、直接看到項目而不必繞 JSON 一圈,請下載 DynoTable

相關範例

參考資料

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

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

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

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