如何高效导出S3桶内千万级文件的URL到文本文件?
高效导出S3桶百万级文件URL的方案
针对1000万份文件的场景,aws s3 ls s3://bucketname > out.txt绝对不是唯一方案,甚至不是最优选择——它输出的是包含日期、大小的完整列表,还要额外处理提取文件名再拼接URL,效率很低。下面是几种更高效的实现方式:
1. 用AWS CLI s3api直接生成URL
利用s3api list-objects-v2的query参数,直接在命令中拼接出S3文件的URL,无需后续处理:
aws s3api list-objects-v2 --bucket bucketname --query 'Contents[].{url: "https://bucketname.s3.amazonaws.com/" + Key}' --output text > s3_urls.txt
- 优势:原生AWS工具,无需额外安装;直接输出纯URL,一步到位;自动处理分页,无需手动拆分请求。
- 区域适配:如果你的桶不在
us-east-1区域,需要调整URL的区域后缀,比如替换成https://bucketname.s3.REGION.amazonaws.com/,也可以动态获取当前CLI配置的区域:aws s3api list-objects-v2 --bucket bucketname --query 'Contents[].{url: "https://bucketname.s3.'$(aws configure get region)'.amazonaws.com/" + Key}' --output text > s3_urls.txt
2. 用第三方工具提升性能
处理千万级文件时,原生AWS CLI的速度可能不够理想,可以用s5cmd(Go语言开发的高性能S3工具),它的列表速度比AWS CLI快3-5倍:
- 先安装
s5cmd(根据系统版本下载对应二进制包即可) - 执行命令生成URL:
s5cmd ls s3://bucketname/ | awk '{print "https://bucketname.s3.amazonaws.com/"$4}' > s3_urls.txt
- 说明:
s5cmd ls输出的第四列是文件的Key(路径),通过awk直接拼接成完整URL。
3. 优化AWS CLI的并行性能
如果坚持用原生AWS CLI,可以调整并发请求数来加快列表速度:
# 临时设置并发请求数为20(默认是10) aws configure set default.s3.max_concurrent_requests 20 # 再执行之前的s3api命令 aws s3api list-objects-v2 --bucket bucketname --query 'Contents[].{url: "https://bucketname.s3.amazonaws.com/" + Key}' --output text > s3_urls.txt
内容的提问来源于stack exchange,提问作者JohnJ
相关产品推荐
相关产品推荐

