用 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用的续读令牌。把它和--page-size设成同一个数:AWS 警告说取值不同"can get unexpected results with missing or duplicated items"。--query是在你自己的机器上跑的——它是作用在已打印结果上的 JMESPath,在每个项目都被读取并计费之后才应用。DynamoDB 看得到的是--projection-expression(再加上给保留字用的--expression-attribute-names),而它缩小的是响应,不是账单。--filter-expression同样是在项目被计费之后才把它们丢掉的(带过滤的 Scan)。- 一切都先缓冲,然后撞上分页器——CLI 会把所有页面攒齐了再打印,而 CLI v2 默认会把结果送进 macOS 和 Linux 上的
less或 Windows 上的more。在一张大表上,这同时意味着一次内存尖峰和一个卡住的终端。加上--no-cli-pager,或者把AWS_PAGER设为空字符串,并用--max-items切片。 - 并行扫描在命令行里同样可用——用
--segment i --total-segments N跑 N 份,每一份自动给自己那一片分页。总成本相同,墙上时钟时间低得多(什么时候值得这么做)。
用可视化的方式来做
一条单行命令可能是一条昂贵的命令。DynamoDB 定价计算器会在你运行之前,给完整读一遍你的表标个价。
DynoTable 是在网格里翻页浏览这张表,而不是在终端缓冲区里,并且能把那个网格背后的 Scan 导出成一条 aws dynamodb 命令。下载 DynoTable。
相关示例
- 在 Node.js 中取出全部项目——用显式循环做同样的完整读取。
- 在 Python 中取出全部项目——用 boto3 的分页器做同样的完整读取。
- 用 AWS CLI 执行 DynamoDB Scan——带
--filter-expression的扫描。 - 并行扫描——Segment/TotalSegments、工作线程数,以及什么时候值得折腾。
- 为什么我的 DynamoDB Scan 又慢又贵?——成本模型以及如何避开它。
- DynamoDB ProvisionedThroughputExceededException——读整张表是撞上它的经典方式。
- "The provided starting key is invalid"——分页循环里被弄坏的续读键。
参考资料
- Scan — Amazon DynamoDB API Reference
- scan — AWS CLI Command Reference
- Using AWS CLI pagination options — AWS CLI User Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。