如何尽可能完整地复制S3存储桶(含权限设置等所有配置)
如何尽可能完整地复制S3存储桶(含权限设置等所有配置)
嘿,我之前也碰到过一模一样的需求!默认的s3 sync确实只搞定了对象数据的复制,但要把存储桶的所有配置(权限、标签、规则这些)都原封不动搬过去,得拆成几个步骤来做,我给你详细说说:
第一步:复制存储桶的基础配置
先把原桶的核心配置都导出来,再应用到新桶上,这些配置包括ACL、标签、版本控制、生命周期规则、加密设置、CORS规则、静态网站托管配置等等。用AWS CLI的话,每个配置都对应一对get和put命令:
桶ACL:
# 导出原桶ACL到文件 aws s3api get-bucket-acl --bucket old-bucket --region us-west-1 > bucket-acl.json # 把ACL应用到新桶 aws s3api put-bucket-acl --bucket new-bucket --region us-west-2 --access-control-policy file://bucket-acl.json桶标签:
aws s3api get-bucket-tagging --bucket old-bucket --region us-west-1 > bucket-tags.json # 如果原桶有标签才执行下面的命令,避免报错 aws s3api put-bucket-tagging --bucket new-bucket --region us-west-2 --tagging file://bucket-tags.json版本控制:
# 先查看原桶的版本控制状态(Enabled/Suspended) aws s3api get-bucket-versioning --bucket old-bucket --region us-west-1 # 根据结果设置新桶的版本控制,比如原桶是Enabled: aws s3api put-bucket-versioning --bucket new-bucket --region us-west-2 --versioning-configuration Status=Enabled桶策略:
aws s3api get-bucket-policy --bucket old-bucket --region us-west-1 > bucket-policy.json # 注意:如果策略里有原桶的ARN,需要先编辑bucket-policy.json把ARN改成新桶的,再执行下面的命令 aws s3api put-bucket-policy --bucket new-bucket --region us-west-2 --policy file://bucket-policy.json
其他像生命周期规则、加密设置、CORS这些,都可以用类似的get-bucket-lifecycle-configuration/put-bucket-lifecycle-configuration、get-bucket-encryption/put-bucket-encryption、get-bucket-cors/put-bucket-cors命令来复制,步骤和上面一致。
第二步:完整复制存储桶内的对象(含对象权限、元数据等)
这时候不能只用默认的s3 sync,得加参数让它保留对象的所有属性:
aws s3 sync s3://old-bucket s3://new-bucket --source-region us-west-1 --region us-west-2 \ --acl preserve \ --metadata-directive COPY \ --preserve-tags \ --sse COPY
解释一下这些参数的作用:
--acl preserve:保留原对象的ACL权限,不会用默认的桶ACL覆盖--metadata-directive COPY:完整复制对象的元数据,比如Content-Type、自定义元数据等--preserve-tags:保留对象的标签--sse COPY:如果原对象用了服务器端加密,复制时保留加密设置
如果原桶开启了版本控制,想要复制所有版本的对象(包括历史版本和删除标记),可以用aws s3 cp配合递归参数:
aws s3 cp s3://old-bucket s3://new-bucket --recursive --source-region us-west-1 --region us-west-2 \ --acl preserve \ --metadata-directive COPY \ --preserve-tags \ --sse COPY \ --copy-props all
第三步:复制其他进阶配置(如果有的话)
如果原桶还有存储桶访问点、日志配置、Replication规则这些,也需要单独处理:
- 存储桶日志配置:用
get-bucket-logging和put-bucket-logging命令,注意日志目标桶的权限需要调整 - 访问点:需要先创建新的访问点,再手动复刻原访问点的配置(因为访问点ARN和桶绑定,无法直接导出导入)
- 跨区域复制(CRR)规则:如果原桶有CRR,需要在新桶重新配置,目标桶换成你需要的位置
注意事项
- 执行这些命令前,确保你的AWS账号有足够的权限(比如
s3:Get*、s3:Put*等权限) - 如果原桶和新桶在不同区域,有些配置(比如存储类)可能需要注意,比如原桶用了Glacier,复制时要确保新桶支持对应的存储类
- 复制桶策略的时候,一定要检查策略里的资源ARN,把原桶的ARN替换成新桶的,否则策略会无效
备注:内容来源于stack exchange,提问作者Franck Dernoncourt
相关产品推荐
相关产品推荐

