如何校验不同AWS账号下的两个Amazon S3存储桶的文件是否一致
跨AWS账号S3存储桶文件对比实现方案
前提条件
- 本地已安装配置AWS CLI,且已配置两个AWS账号的命名配置文件(可自定义命名,示例中使用
account1、account2指代两个账号的配置名) - 两个账号的访问凭证均已获得对应S3存储桶的
s3:ListBucket权限
方案1:仅通过AWS CLI + 系统命令实现(适合10万级以下文件量)
S3控制台没有内置的跨桶对比功能,你可以直接通过以下CLI命令快速完成对比:
- 分别导出两个存储桶的全量对象键(文件名)列表
# 导出账号1下bucket-a的文件列表 aws s3 ls s3://bucket-a --recursive --profile account1 | awk '{print $4}' > bucket-a_list.txt # 导出账号2下bucket-b的文件列表 aws s3 ls s3://bucket-b --recursive --profile account2 | awk '{print $4}' > bucket-b_list.txt
- 执行对比命令生成三类结果
# 两个桶共有的文件列表,输出到common_files.txt comm -12 <(sort bucket-a_list.txt) <(sort bucket-b_list.txt) > common_files.txt # 仅在bucket-a存在的独有文件列表,输出到bucket-a_only.txt comm -23 <(sort bucket-a_list.txt) <(sort bucket-b_list.txt) > bucket-a_only.txt # 仅在bucket-b存在的独有文件列表,输出到bucket-b_only.txt comm -13 <(sort bucket-a_list.txt) <(sort bucket-b_list.txt) > bucket-b_only.txt
以上命令适用于Linux/macOS环境,Windows环境可通过WSL、Git Bash运行
方案2:需同时校验文件内容一致性的场景
如果需要确认相同文件名的文件内容是否完全一致,可以导出带ETag的列表做对比:
# 导出bucket-a带ETag的对象列表 aws s3api list-objects-v2 --bucket bucket-a --profile account1 --query "Contents[].[Key, ETag]" --output text | sort > bucket-a_etag.txt # 导出bucket-b带ETag的对象列表 aws s3api list-objects-v2 --bucket bucket-b --profile account2 --query "Contents[].[Key, ETag]" --output text | sort > bucket-b_etag.txt # 用comm命令对比即可,只有文件名和ETag都匹配才会判定为相同文件
其他说明
- 千级文件量的情况下,上述方案全程仅需几秒即可完成
- 如果是百万级以上的超大文件量,可以先开启两个桶的S3 Inventory功能导出全量清单,再对清单文件做对比即可
内容的提问来源于stack exchange,提问作者Sabo Boz
相关产品推荐
相关产品推荐

