如何将所有对象从一个 Amazon S3 存储桶复制到另一个存储桶?
上次更新时间:2020 年 12 月 23 日
我想将所有对象从一个 Amazon Simple Storage Service (Amazon S3) 存储桶移至另一个 存储桶。如何在 S3 存储桶之间迁移对象?
简短描述
如要将对象从一个 S3 存储桶复制到另一个存储桶,请执行如下步骤:
1. 创建新的 S3 存储桶。
2. 安装并配置 AWS 命令行界面 (AWS CLI)。
3. 在 S3 存储桶之间复制对象。
4. 验证对象是否已复制。
5. 将现有 API 调用更新为目标存储桶的名称。
在开始之前,请考虑以下事项:
- 如果 S3 存储桶中有许多对象(超过 1000 万个对象),请考虑使用 S3 批量操作。您可以使用 S3 批量操作自动执行复制过程。
- 要跨 AWS 账户复制对象,您必须为存储桶和相关的 AWS Identity and Access Management (IAM) 角色设置正确的跨账户权限。
- 如果您使用 AWS CLI 版本 2 跨存储桶复制对象,则您的 IAM 角色还必须拥有对源对象的 s3:GetObjectTagging 以及对目标对象的 s3:PutObjectTagging 的权限。
- 要提高同步过程的性能,您可以调优 AWS CLI 以使用更高的并发度。您也可以根据不同的前缀拆分同步命令,以优化 S3 存储桶的性能。有关优化工作负载性能的更多信息,请参阅最佳实践设计模式:优化 Amazon S3 性能。
解决方法
创建新的 S3 存储桶
1. 打开 Amazon S3 控制台。
2. 选择创建存储桶。
3. 为您的新存储桶选择一个符合 DNS 标准的名称。
4. 选择您的 AWS 区域。
注意:最好目标存储桶与源存储桶位于同一区域,以避免跨区域流量带来的性能问题。
5. 或者,选择从现有存储桶复制设置,以复制源存储桶的配置。
安装和配置 AWS CLI
1. 安装 AWS CLI。
2. 运行以下命令,配置 AWS CLI:
aws configure
注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
3. 输入您的访问密钥(访问密钥 ID 和秘密访问密钥)。
4. 按 Enter 跳过默认区域和默认输出选项。有关区域参数的信息请参阅适用于 Amazon S3 的 AWS 区域和终端节点。
注意:AWS CLI 输出为 JSON、文本或表,但并非所有命令都支持每种类型的输出。有关更多信息,请参阅控制 AWS CLI 的命令输出。
在 S3 存储桶之间复制对象
1. 如果您将 S3 对象存档在 Amazon Simple Storage Service Glacier 存储类中,请还原对象。
2. 使用 AWS CLI 运行以下 sync 命令,在源存储桶和目标存储桶之间复制对象:
aws s3 sync s3://DOC-EXAMPLE-BUCKET-SOURCE s3://DOC-EXAMPLE-BUCKET-TARGET
sync 命令使用 CopyObject API 在 S3 存储桶之间复制对象。sync 命令会列出源存储桶和目标存储桶,以识别出位于源存储桶而没有位于目标存储桶中的对象。该命令还会识别出源存储桶中 LastModified 日期与目标存储桶中不同的对象。对版本控制存储桶执行 sync 命令将仅复制当前版本的对象,不会复制早期版本的对象。默认情况下,这样会保留对象元数据,但是您的 AWS 账户的访问控制列表 (ACL) 设置为 FULL_CONTROL,这会删除任何其他 ACL。如果操作失败,您可以重新运行 sync 命令,但不复制先前所复制的对象。
要解决同步操作的问题,请参阅为何无法在两个 Amazon S3 存储桶之间复制对象?
验证对象是否已复制
1. 运行以下命令,验证源存储桶和目标存储桶的内容:
aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-SOURCE --summarize > bucket-contents-source.txt
aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-TARGET --summarize > bucket-contents-target.txt
注意:请更新命令以包含源存储桶名称和目标存储桶的名称。
2. 使用保存到 AWS CLI 目录文件中的输出,比较源存储桶和目标存储桶中的对象。请参见以下示例输出:
$ aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET --summarize
2017-11-20 21:17:39 15362 s3logo.png
Total Objects: 1 Total Size: 15362
将现有 API 调用更新为目标存储桶的名称
更新任何现有的应用程序或工作负载,确保它们使用目标存储桶名称。如果您经常进行写入操作,您可能需要运行 sync命令来解决源存储桶和目标存储桶之间的差异。