如何将所有对象从一个 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 存储桶

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命令来解决源存储桶和目标存储桶之间的差异。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?