使用AWS s3api list-objects列出内容时卡住无响应的问题求助
解决AWS s3api list-objects卡住且实现分页获取NextToken的问题
我之前也碰到过类似的情况,咱们一步步来排查解决:
为什么s3api list-objects会卡住?
最常见的原因是你的存储桶里对象数量太多:
aws s3 ls内部会自动做分页处理,并且边获取边输出结果,所以看起来能正常返回;- 而
aws s3api list-objects默认会尝试一次性拉取所有对象数据,当对象量很大时,会因为等待全量数据传输完成而卡住,甚至超时。
用s3api实现分页+获取NextToken的正确姿势
你需要手动指定分页参数,强制命令分批返回结果,同时拿到NextToken用于下一页查询:
1. 首次查询(获取第一页+NextToken)
执行命令时加上--max-items指定每页返回的对象数量(比如1000):
aws s3api list-objects --bucket user_list_staging --max-items 1000
响应结果里会包含NextToken字段(如果还有更多对象未返回),把这个值记下来用于下一页查询。
2. 后续分页查询(使用NextToken)
用上一步拿到的NextToken,加上--starting-token参数继续查询:
aws s3api list-objects --bucket user_list_staging --max-items 1000 --starting-token "你的NextToken值"
重复这个步骤,直到响应里不再出现NextToken,说明已经获取完所有对象。
3. 自动化循环分页(Shell脚本示例)
如果需要自动遍历所有分页,可以用Shell脚本+jq(JSON处理工具)来实现:
#!/bin/bash BUCKET_NAME="user_list_staging" MAX_ITEMS=1000 next_token="" while true; do # 根据是否有next_token构建命令 if [ -z "$next_token" ]; then response=$(aws s3api list-objects --bucket "$BUCKET_NAME" --max-items "$MAX_ITEMS") else response=$(aws s3api list-objects --bucket "$BUCKET_NAME" --max-items "$MAX_ITEMS" --starting-token "$next_token") fi # 这里可以自定义处理逻辑,比如提取对象的Key echo "$response" | jq '.Contents[] | .Key' # 获取下一页的token next_token=$(echo "$response" | jq -r '.NextToken') # 没有next_token时退出循环 if [ "$next_token" == "null" ]; then break fi done
注意:需要提前安装jq(大部分Linux发行版可以用apt install jq或yum install jq安装)。
额外排查建议
- 检查AWS CLI版本:旧版本可能存在性能或兼容性问题,建议更新到最新版:
pip install --upgrade awscli - 确认网络环境:如果是在受限网络下,可能需要检查是否有代理或防火墙阻止了s3api的长连接,不过
s3 ls能正常工作的话,这个概率较低。
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

