如何从另一个 AWS 账户复制 Amazon S3 对象?
我想在 AWS 账户之间复制 Amazon Simple Storage Service(Amazon S3)对象,并确保目标账户拥有复制的对象。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
上传对象的 AWS 账户不会自动拥有 Amazon S3 中的对象。更改 S3 对象所有权设置时,最佳做法是使用强制存储桶拥有者设置。强制存储桶拥有者设置简化了存储在 Amazon S3 中的数据的访问管理。但是,此选项会关闭所有存储桶访问控制列表 (ACL) 和您的存储桶中任何对象上的 ACL。
当在“S3 对象所有权”中使用强制存储桶拥有者设置时,同一个存储桶拥有者将自动拥有 Amazon S3 存储桶中的所有对象。对于现有存储桶,除非您明确关闭 ACL,否则上传 S3 对象的账户将拥有该对象。
如果您的现有方法依赖于 ACL 来共享对象,请确定使用 ACL 访问对象的主体。有关详细信息,请参阅关闭 ACL的先决条件。
如果您无法关闭 ACL,请按照以下步骤获取对象的所有权,直到您可以调整您的存储桶策略:
-
在源账户中,创建 AWS Identity and Access Management (IAM) 客户管理型策略,以向 IAM 身份授予跨账户访问权限。IAM 用户必须有权从源存储桶检索对象并将对象放入目标存储桶。
策略示例:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET", "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET", "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*" ] } ] }
**注意:**前面的示例 IAM 策略仅包含列出对象以及将对象复制到不同账户的存储桶所需的最低权限。根据您的用例自定义允许的 S3 操作。例如,如果用户必须复制具有对象标签的对象,则您还必须授予 s3:GetObjectTagging 的权限。如果您遇到权限错误,请以管理员用户的身份找出与 IAM 相关的问题。
-
在源账户中,将客户管理型策略附加到 IAM 身份。
-
在目标账户中,将目标存储桶上的S3 对象所有权设置为存储桶拥有者优先。目标账户现在将自动拥有您在 ACL 设置为 bucket-owner-full-control 的情况下上传的新对象。
-
在目标账户中,修改目标的存储桶策略,以授予源账户上传对象的权限。此外,在存储桶策略中包含一个条件,要求上传对象时将 ACL 设置为 bucket-owner-full-control。
策略示例:{ "Version": "2012-10-17", "Id": "Policy1611277539797", "Statement": [ { "Sid": "Stmt1611277535086", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::222222222222:user/Jane" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } }, { "Sid": "Stmt1611277877767", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::222222222222:user/Jane" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET" } ] }
**注意:**请将 destination-DOC-EXAMPLE-BUCKET 替换为目标存储桶的名称,将 arn:aws:iam::222222222222:user/Jane 替换为源账户中 IAM 身份的 ARN。
之前示例存储桶策略仅包括上传具有所需 ACL 的对象所需的最低权限。根据您的用例自定义允许的 S3 操作。 -
确保将 ACL 设置为 bucket-owner-full-control,以便源账户的 IAM 身份可以将对象上传到目标存储桶。例如,源 IAM 身份必须运行带有 —acl 选项的 AWS CLI 命令 cp:
aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control
在前面的示例中,该命令复制了文件 object.txt。要复制整个文件夹,请运行以下命令:
aws s3 cp directory/ s3://bucketname/directory --recursive --acl bucket-owner-full-control
**注意:**如果您收到 AccessDenied 错误,请参阅排查 Amazon S3 中的拒绝访问 (403 Forbidden) 错误。
**重要事项:**如果您的 S3 存储桶在激活 AWS Key Management Service (AWS KMS) 的情况下进行了默认加密,则您还必须修改 AWS KMS 密钥权限。有关说明,请参阅我的 Amazon S3 存储桶默认使用自定义 AWS KMS 密钥进行加密。我如何允许用户从存储桶下载和上传到存储桶?
要在 S3 存储桶之间复制大量数据,请参阅将大量数据从一个 Amazon S3 存储桶传输到另一个存储桶的最佳方法是什么?此外,请参阅将大量数据上传到 Amazon S3 时如何优化性能?
相关信息
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 10 个月前