如何在 Amazon S3 存储桶之间复制对象?

上次更新时间:2019 年 4 月 12 日

我需要将所有对象从一个 Amazon Simple Storage Service (S3) 存储桶移至另一个 S3 存储桶。如何在 S3 存储桶之间迁移对象? 

简短描述

要将对象从一个 S3 存储桶复制到另一个 S3 存储桶,请执行以下步骤:

1.    创建新的 S3 存储桶。

2.    安装并配置 AWS 命令行界面 (AWS CLI)。

3.    在 S3 存储桶之间复制对象。

4.    验证对象是否已复制。

5.    将现有 API 调用更新为新存储桶的名称。

在开始之前,请考虑将 AWS CLI 调整为使用更高的并发度,以提高同步过程的性能。有关配置选项的更多信息,请参阅 AWS CLI S3 配置。有关数据传输的价格的更多信息,请参阅 Amazon S3 定价

如果 S3 存储桶中有很多对象(超过 1000 万个对象),请考虑使用 Amazon S3 清单报告Amazon CloudWatch 指标。这些报告可以帮助优化验证已复制对象的成本和性能。您也可以根据不同的前缀拆分同步命令,以优化 S3 存储桶的性能。有关优化工作负载的性能的更多信息,请参阅请求速率和性能指南

解决方法

创建新的 S3 存储桶

1.    打开 Amazon S3 控制台

2.    选择创建存储桶

3.    为您的新存储桶选择一个符合 DNS 标准的名称

4.    选择您的 AWS 区域。
注意:最好新存储桶与源存储桶位于同一区域,以避免跨区域流量带来的性能问题。

5.    如果需要,选择从现有存储桶复制设置,以复制源存储桶的配置。

安装并配置 AWS 命令行界面 (AWS CLI)

1.    安装 AWS CLI

2.    运行以下命令,配置 AWS CLI:

aws configure

3.    输入您的访问密钥(访问密钥 ID 和秘密访问密钥)

4.    按 Enter 以跳过默认区域和默认输出选项。有关区域参数的更多信息,请参阅Amazon S3 的 AWS 区域和终端节点
注意:AWS CLI 输出为 JSON、文本或表,但并非所有命令都支持每种类型的输出。如果命令输出不支持您选择的格式,则将默认采用自有的格式。有关更多信息,请参阅控制 AWS CLI 的命令输出

在 S3 存储桶之间复制对象

1.    如果您将 S3 对象存档在 Amazon Simple Storage Service Glacier 中,请还原 Amazon S3 Glacier 中存储的对象

2.    运行以下 sync 命令,在源存储桶和目标存储桶之间复制对象:

aws s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME

注意:请更新命令以包含目标存储桶名称和源存储桶的名称。

sync 命令使用 CopyObject API 在 S3 存储桶之间复制对象。sync 命令会列出源存储桶和目标存储桶,以识别出位于源存储桶而没有位于目标存储桶中的对象。该命令还会识别出源存储桶中 LastModified 日期与目标存储桶中不同的对象。对版本控制存储桶执行 sync 命令将仅复制当前版本的对象,不会复制早期版本的对象。默认情况下,这样会保留对象元数据,但是您的 AWS 账户的访问控制列表 (ACL) 设置为 FULL_CONTROL,这会删除任何其他 ACL。如果操作失败,可以再次运行 sync 命令,但不会复制之前已复制的对象。

验证对象是否已复制

1.    运行以下命令,验证源存储桶和目标存储桶的内容:

aws s3 ls --recursive s3://SOURCE_BUCKET_NAME --summarize > bucket-contents-source.txt
aws s3 ls --recursive s3://NEW_BUCKET_NAME --summarize > bucket-contents-new.txt

注意:请更新命令以包含源存储桶名称和目标存储桶的名称。

2.    使用保存到 AWS CLI 目录文件中的输出,比较源存储桶和目标存储桶中的对象。请参阅以下示例输出:

$ aws s3 ls --recursive s3://BUCKETNAME --summarize
2017-11-20 21:17:39      15362 s3logo.png

  Total Objects: 1        Total Size: 15362

将现有 API 调用更新为新存储桶的名称

更新任何现有的应用程序或工作负载,确保它们使用新存储桶名称。如果写入操作频繁,可能需要通过运行 sync 命令来解决源存储桶和目标存储桶之间的差异。


这篇文章对您有帮助吗?

您觉得我们哪些地方需要改进?


需要更多帮助?