Global outage event
If you’re experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
如何将所有对象从一个 Amazon S3 存储桶复制到另一个存储桶?
我想将我的所有对象从一个 Amazon Simple Storage Service (Amazon S3) 存储桶复制或移动到另一个存储桶。
简短描述
要将对象从一个 S3 存储桶复制到另一个存储桶,请选择以下选项之一:
sync 命令适用于不太大的存储桶。但是,运行 sync 命令来复制包含数百万个对象的大存储桶花费巨大,而且复制操作可能会出现超时。如果您在复制存储桶时遇到超时情况,请使用 Amazon CloudWatch 指标来计算存储桶中对象的大小和数量。如果您的 S3 存储桶中包含数百万个对象,则最佳做法是使用 S3 批量操作来复制您的对象。
**注意:**要将您存储桶中的对象复制到其他 AWS 账户拥有的存储桶,请使用 AWS Identity and Access Management (IAM) 来设置跨账户权限。确保您的 IAM 角色拥有源对象的 s3:GetObjectTagging 权限和目标对象的 s3:PutObjectTagging 权限。
要提高同步性能以及更快地复制对象,请执行以下一项或多项操作:
- 调整 AWS CLI 以使用更高的并发量
- 根据对象名称前缀将该过程拆分为使用多个 sync 命令
- 根据最佳实践组织您的 S3 存储桶架构
解决方法
**注意:**如果您在运行 AWS CLI 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
在 S3 存储桶之间复制对象
要将对象从一个存储桶复制到另一个存储桶,请完成以下步骤:
-
如果您在 Amazon Simple Storage Service Glacier 存储类中存档 S3 对象,则请还原这些对象。
-
运行下面的 sync 命令,但将 example_source_bucket 和example_target_bucket 替换为您的 S3 存储桶名称:
aws s3 sync s3://example_source_bucket s3://example_target_bucket**注意:**sync 命令仅复制当前不在目标存储桶中的对象。要显式复制每个对象,请使用 cp 命令而不是 sync 命令。当您在受版本控制的存储桶上使用 sync 命令时,仅会复制每个对象的当前版本。默认情况下,此行为会保留对象元数据。
-
(可选)如果您遇到超时情况,请使用 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 存储桶之间复制对象?
验证对象是否已复制
要验证对象是否已复制,请完成以下步骤:
- 要验证源存储桶和目标存储桶的内容,请运行以下 ls 命令:
aws s3 ls --recursive s3://example_source_bucket --summarize > bucket-contents-source.txt
**注意:**对于大型存储桶,ls 命令可能会出现超时。对于大型存储桶,请使用 CloudWatch 指标而不是 ls 命令来计算存储桶大小和对象总数。但是,由于 Amazon CloudWatch 指标每天仅提取一次,因此 CloudWatch 结果可能与 ls 命令的结果有所不同。aws s3 ls --recursive s3://example_target_bucket --summarize > bucket-contents-target.txt - 使用运行先前的 ls 命令输出的文本文件比较源存储桶和目标存储桶之间的对象。输出结果将类似于以下示例:
2017-11-20 21:17:39 15362 s3logo.png Total Objects: 1 Total Size: 15362
**注意:**如果您的应用程序或工作负载向源存储桶发出 API 调用,请将这些 API 调用更新到目标存储桶。如果您经常执行写入操作,则可能需要运行 sync 命令来解决源存储桶和目标存储桶之间的差异。

