用 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循环还算能忍的原因。两次尝试之间要 sleep;立刻重跑会撞上同一个被限流的分区。 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 官方文档。