如何将所有对象从一个 Amazon S3 桶复制到另一个桶?

2 分钟阅读
0

我想将我的所有对象从一个 Amazon Simple Storage Service (Amazon S3) 桶复制或移动到另一个桶。我想在我的 S3 桶之间迁移对象。

简述

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

1.    创建新的 S3 桶。

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

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

**注意:**在大型桶(包含至少 1000 万个对象)上使用 aws s3 lsaws s3 sync 命令可能需要支付较高费用并导致超时。如果您由于桶过大而遇到超时的情况,请考虑使用 Amazon CloudWatch 指标来计算桶中对象的大小和数量。此外,可以考虑使用 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.    如果您在 Amazon Simple Storage Service Glacier 存储类中存档 S3 对象,则请还原这些对象

2.    使用 AWS CLI 运行以下 sync 命令,在源桶和目标桶之间复制对象:

aws s3 sync s3://DOC-EXAMPLE-BUCKET-SOURCE s3://DOC-EXAMPLE-BUCKET-TARGET

注意:更新同步命令以纳入您的源桶和目标桶名称。

同步命令使用 CopyObject API 在 S3 桶之间复制对象。sync 命令列出源桶和目标桶,以识别存在于源桶中但不在目标桶中的对象。该命令还可识别源桶中具有不同 LastModified 日期(与目标桶中的对象的相应日期相比)的对象。当您在受版本控制的桶上使用 sync 命令时,仅复制对象的当前版本,而不会复制以前的版本。默认情况下,此行为会保留对象元数据。

如果源桶启用了访问控制列表 (ACL),则 ACL 不会被复制到目标桶。无论目标桶上是否启用 ACL,都是如此。如果源桶和目标桶都启用了 ACL,则目标对象 ACL 将向执行复制操作的账户授予 FULL_CONTROL。如果操作失败,您可以再次运行 sync 命令,而无需复制先前复制的对象。要解决 sync 操作的问题,请参阅为什么我无法在两个 Amazon S3 桶之间复制对象?

3.    (可选)如果您遇到超时的情况,请使用 cloudwatch get-metric-statistics 命令来计算桶中的对象数量:

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name NumberOfObjects --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=AllStorageTypes --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 600 --statistic Average --output json

4.    (可选)如果您遇到超时的情况,请使用 cloudwatch get-metric-statistics 命令来检索桶的大小:

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=StandardStorage --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 3600 --statistics Average --unit Bytes --output json

**注意:**列表调用可能非常耗时,从而导致命令超时。对于大型桶,可以考虑改用 Amazon CloudWatch 指标来计算桶的大小和对象总数。但是,由于 Amazon CloudWatch 指标每天仅提取一次,因此所报告的对象数量和桶大小可能与 list 命令结果不同。

验证是否已复制对象

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

注意: 更新 list 命令以纳入您的源桶和目标桶名称。

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

相关信息

Amazon S3 定价

将对象复制到文件夹

在 Amazon S3 中执行大规模删除操作后,list 命令没有响应。如何解决此问题?

AWS 官方
AWS 官方已更新 2 年前