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

2 分钟阅读
0

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

简短描述

要将对象从一个 S3 存储桶复制到另一个存储桶,请选择以下选项之一:

  • 从 AWS 命令行界面 (AWS CLI) 运行 sync 命令
  • 对包含大量对象的存储桶使用 S3 批量操作

sync 命令适用于不太大的存储桶。但是,运行 sync 命令来复制包含数百万个对象的大存储桶花费巨大,而且复制操作可能会出现超时。如果您在复制存储桶时遇到超时情况,请使用 Amazon CloudWatch 指标来计算存储桶中对象的大小和数量。如果您的 S3 存储桶中包含数百万个对象,则最佳做法是使用 S3 批量操作来复制您的对象。

**注意:**要将您存储桶中的对象复制到其他 AWS 账户拥有的存储桶,请使用 AWS Identity and Access Management (IAM) 来设置跨账户权限。确保您的 IAM 角色拥有源对象的 s3:GetObjectTagging 权限和目标对象的 s3:PutObjectTagging 权限。

要提高同步性能以及更快地复制对象,请执行以下一项或多项操作:

解决方法

**注意:**如果您在运行 AWS CLI 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

在 S3 存储桶之间复制对象

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

  1. 如果您在 Amazon Simple Storage Service Glacier 存储类中存档 S3 对象,则请还原这些对象

  2. 运行下面的 sync 命令,但将 example_source_bucketexample_target_bucket 替换为您的 S3 存储桶名称:

    aws s3 sync s3://example_source_bucket s3://example_target_bucket

    **注意:**sync 命令仅复制当前不在目标存储桶中的对象。要显式复制每个对象,请使用 cp 命令而不是 sync 命令。当您在受版本控制的存储桶上使用 sync 命令时,仅会复制每个对象的当前版本。默认情况下,此行为会保留对象元数据。

  3. (可选)如果您遇到超时情况,请使用 CloudWatch 的 get-metric-statistics 命令来计算存储桶大小以及对象数量。

    要计算存储桶的大小,请运行以下命令:

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

    要计算存储桶中对象的数量,请运行以下命令:

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

    如果您的存储桶很大且包含数百万个对象,请不要使用 sync 命令。请在复制存储桶时改用 S3 批量操作。

**重要事项:**运行 sync 命令时,不会将访问控制列表 (ACL) 从源存储桶复制到目标存储桶。如果源存储桶和目标存储桶都具有活动 ACL,则目标对象 ACL 将向执行复制操作的账户授予 FULL_CONTROL。要对 sync 命令问题进行故障排除,请参阅为什么我无法在两个 Amazon S3 存储桶之间复制对象?

验证对象是否已复制

要验证对象是否已复制,请完成以下步骤:

  1. 要验证源存储桶和目标存储桶的内容,请运行以下 ls 命令:
    aws s3 ls --recursive s3://example_source_bucket --summarize > bucket-contents-source.txt
    aws s3 ls --recursive s3://example_target_bucket --summarize > bucket-contents-target.txt
    **注意:**对于大型存储桶,ls 命令可能会出现超时。对于大型存储桶,请使用 CloudWatch 指标而不是 ls 命令来计算存储桶大小和对象总数。但是,由于 Amazon CloudWatch 指标每天仅提取一次,因此 CloudWatch 结果可能与 ls 命令的结果有所不同。
  2. 使用运行先前的 ls 命令输出的文本文件比较源存储桶和目标存储桶之间的对象。输出结果将类似于以下示例:
    2017-11-20 21:17:39      15362 s3logo.png
    
      Total Objects: 1        Total Size: 15362

**注意:**如果您的应用程序或工作负载向源存储桶发出 API 调用,请将这些 API 调用更新到目标存储桶。如果您经常执行写入操作,则可能需要运行 sync 命令来解决源存储桶和目标存储桶之间的差异。

相关信息

Amazon S3 定价

将对象复制到目录存储桶

在 Amazon S3 中执行大量删除操作后,如何对列表命令无响应问题进行故障排除?

如何从另一个 AWS 账户复制 Amazon S3 对象?

AWS 官方
AWS 官方已更新 4 个月前