如何将所有对象从一个 Amazon S3 桶复制到另一个桶?
我想将我的所有对象从一个 Amazon Simple Storage Service (Amazon S3) 桶复制或移动到另一个桶。我想在我的 S3 桶之间迁移对象。
简述
要将对象从一个 Amazon S3 桶复制到另一个 Amazon S3 桶,请执行以下步骤:
1. 创建新的 S3 桶。
2. 安装和配置 AWS 命令行界面(AWS CLI)。
3. 在 S3 桶之间复制对象。
**注意:**在大型桶(包含至少 1000 万个对象)上使用 aws s3 ls 或 aws s3 sync 命令可能需要支付较高费用并导致超时。如果您由于桶过大而遇到超时的情况,请考虑使用 Amazon CloudWatch 指标来计算桶中对象的大小和数量。此外,可以考虑使用 S3 批量操作来复制对象。
4. 验证是否已复制对象。
5. 将现有 API 调用更新为目标桶名称。
开始之前,请考虑以下事项:
- 如果您的 S3 桶中有许多对象(超过 1000 万个对象),则可以考虑使用 S3 批量操作。您可以使用 S3 批量操作来自动执行复制过程。
- 要在 AWS 账户之间复制对象,请在桶和相关的 AWS Identity and Access Management(AWS IAM)角色上设置正确的跨账户权限。
- 如果您使用 AWS CLI 版本 2 跨桶复制对象,则您的 IAM 角色还必须具有适当的权限。确保您的 IAM 角色可以访问源对象的 s3:GetObjectTagging 和目标对象的 s3:PutObjectTagging。
- 要提高同步过程的性能,请调整 AWS CLI 以使用更高的并发量。您还可以将 sync 命令拆分为不同的前缀,以优化 S3 桶性能。有关优化工作负载性能的详细信息,请参阅最佳实践设计模式: 优化 Amazon S3 性能。
解决方法
创建新的 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 命令来解决源桶和目标桶之间的差异。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 6 个月前
- AWS 官方已更新 10 个月前
- AWS 官方已更新 6 个月前