AWS CLI中--starting-token参数的默认初始值及循环扫描问题
--starting-token的初始值问题 嘿,我来帮你搞定这个小困扰!其实你一开始就走进了一个小误区——第一次执行DynamoDB的scan命令时,完全不需要指定--starting-token参数!
为什么你之前的尝试都报错?
你看到的错误提示Invalid type for parameter ExclusiveStartKey, value: 0, type: <type 'unicode'>, valid types: <type 'dict'>已经说得很清楚了:--starting-token对应的是API里的ExclusiveStartKey参数,它要求是一个字典类型,用来标记上一次扫描结束的位置。而你试的0、空字符串、null都不符合这个类型要求,自然会报错。
这个参数本质上是用来做分页查询的:只有当第一次扫描返回了NextToken字段(说明还有未返回的数据),后续请求才需要把这个NextToken的值传给--starting-token,才能获取下一页的结果。
正确的执行步骤
第一次扫描(无分页标记)
直接执行不带--starting-token的命令即可:aws dynamodb scan --table-name MyTable --index-name nyIndex --max-items 5执行后如果结果里有
NextToken字段,就意味着还有更多数据可以获取。后续分页扫描(带
NextToken)
把第一次返回的NextToken值作为--starting-token的参数传入,比如假设NextToken的值是"eyJFeGN...":aws dynamodb scan --table-name MyTable --index-name nyIndex --max-items 5 --starting-token "eyJFeGN..."
写循环的正确姿势
如果要自动完成分页扫描,你可以用bash循环结合jq(用来解析JSON结果)来实现,逻辑是:先执行无标记的扫描,然后循环检查是否有NextToken,有就继续用该标记请求,直到没有更多数据为止:
token="" while true; do # 根据token是否为空,决定是否带starting-token参数 if [ -z "$token" ]; then result=$(aws dynamodb scan --table-name MyTable --index-name nyIndex --max-items 5) else result=$(aws dynamodb scan --table-name MyTable --index-name nyIndex --max-items 5 --starting-token "$token") fi # 这里可以添加你对扫描结果的处理逻辑,比如保存到文件、打印等 echo "$result" # 提取NextToken,如果没有则返回空字符串 token=$(echo "$result" | jq -r '.NextToken // empty') # 没有NextToken就退出循环 if [ -z "$token" ]; then break fi done
总结一下:第一次扫描不用加--starting-token,后续请求只用传DynamoDB返回的NextToken就行,别自己瞎填数值或空值啦!
内容的提问来源于stack exchange,提问作者Jinggang

