如何在AWS CLI中使用LastEvaluatedKey作为ExclusiveStartKey实现分页
解决DynamoDB Scan分页获取全量数据的正确操作
核心问题分析
你遇到的报错主要源于两个错误:
- 参数名误用:你使用了
--ExclusiveStartKey(大写开头)或--starting-token,但DynamoDB Scan命令的正确分页参数是**--exclusive-start-key**(全小写+连字符分隔)。 - 格式不符合要求:
--exclusive-start-key必须传入与返回的LastEvaluatedKey完全一致的JSON结构,不能直接粘贴原始字符串。
手动分页步骤
首次执行Scan:
aws dynamodb scan --table-name core_samples若结果中存在
LastEvaluatedKey字段,说明还有未返回的数据,需要继续分页查询。后续分页查询:
将上一次返回的LastEvaluatedKey完整JSON作为--exclusive-start-key的值传入。例如,假设LastEvaluatedKey是:{"sample_id": {"S": "sample_001"}}则执行命令:
# Bash环境用单引号包裹JSON aws dynamodb scan --table-name core_samples --exclusive-start-key '{"sample_id": {"S": "sample_001"}}'如果是Windows命令提示符,需要转义双引号:
aws dynamodb scan --table-name core_samples --exclusive-start-key "{\"sample_id\": {\"S\": \"sample_001\"}}"终止条件:
当返回结果中不再出现LastEvaluatedKey时,说明已获取全量数据。
自动分页脚本(Bash)
如果数据量较大,手动分页效率低,可以用脚本自动循环处理(需提前安装jq工具解析JSON):
#!/bin/bash TABLE_NAME="core_samples" LAST_KEY="" while true; do # 构造扫描命令 if [ -z "$LAST_KEY" ]; then RESPONSE=$(aws dynamodb scan --table-name "$TABLE_NAME" --output json) else RESPONSE=$(aws dynamodb scan --table-name "$TABLE_NAME" --exclusive-start-key "$LAST_KEY" --output json) fi # 输出当前页的Items(可根据需求修改输出格式) echo "$RESPONSE" | jq '.Items' # 获取下一页的起始键 LAST_KEY=$(echo "$RESPONSE" | jq -r '.LastEvaluatedKey | tostring') # 没有LastEvaluatedKey则退出循环 if [ "$LAST_KEY" == "null" ]; then break fi done
更简便的内置分页方式
AWS CLI支持内置分页器,无需手动处理LastEvaluatedKey,直接指定--max-items(总获取条数)和--page-size(每次请求条数)即可:
# 获取全量数据(若总条数超过10000,可调整--max-items的值) aws dynamodb scan --table-name core_samples --max-items 10000 --page-size 1000
为什么--starting-token不可用
--starting-token是AWS CLI的全局分页参数,但仅适用于采用"通用token分页"的服务接口,DynamoDB Scan使用的是专属的ExclusiveStartKey机制,因此该参数不适用,会触发报错。
内容的提问来源于stack exchange,提问作者Manatsa Mbanje
相关产品推荐
相关产品推荐

