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

2 分钟阅读
0

我想在 AWS 账户之间复制 Amazon Simple Storage Service (Amazon S3) 对象。另外,我还想确保目标账户拥有复制的对象。

解决方案

重要信息:S3 中的对象并非始终自动归属于上传它们的 AWS 账户。更改对象所有权时,最佳做法是使用强制桶拥有者设置。但是,此选项会关闭您的存储桶中任何对象上的所有 ACL 和 ACL存储桶。

在“S3 对象所有权”中设置强制桶拥有者后,同一个存储桶拥有者将自动拥有 Amazon S3 存储桶中的所有对象。强制桶拥有者功能还会关闭所有访问控制列表 (ACL)。这简化了存储在 Amazon S3 中的数据的访问管理。但是,对于现有存储桶,除非您明确关闭 ACL,否则 S3 对象仍归属于上传该对象的 AWS 账户。

如果您现有的共享对象方法依赖于使用 ACL,请确认使用 ACL 访问对象的主体。有关在关闭任何 ACL 之前如何查看权限的更多信息,请参阅关闭 ACL 的先决条件

如果您无法关闭 ACL,请按照以下步骤获取对象的所有权,直到您可以调整您的存储桶策略

  1. 在源账户中,创建 AWS Identity and Access Management (AWS IAM) 客户管理型策略,向 IAM 身份(用户或角色)授予适当权限。IAM 用户必须有权从源存储桶找回对象并将对象放回目标存储桶。您可以使用类似于以下示例的 IAM policy:
{
  "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 policy 仅包含列出对象和在不同账户的存储段之间复制对象时所需的最低权限。您必须根据您的用例自定义允许的 S3 操作。例如,如果用户必须复制具有对象标签的对象,则您还必须授予 s3:GetObjectTagging 的权限。如果您遇到错误,请尝试以管理员用户身份执行这些步骤。

  1. 在源账户中,将客户管理型策略附加到您要用来将对象复制到目标存储桶的 IAM 身份

  2. 在目标账户中,将目标存储桶上的“S3 对象所有权”设置为“首选桶拥有者”。设置 S3 对象所有权后,将访问控制列表 (ACL) 设置为存储桶拥有者完全控制的情况下上传的新对象将自动归存储桶账户所有。

  3. 在目标账户中,修改目标存储桶的存储桶策略以授予源账户上传对象的权限。此外,在存储桶策略中加入一个条件,要求上传对象将 ACL 设置为存储桶拥有者完全控制。您可以使用类似于以下示例的语句:

**注意:**将 destination-DOC-EXAMPLE-BUCKET 替换为目标存储桶的名称。然后,将 arn:aws:iam::222222222222:user/Jane 替换为源账户中 IAM 身份的 Amazon 资源名称 (ARN)

{
  "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"
    }
  \]
}

此示例存储桶策略仅包括上传具有所需 ACL 的对象所需的最低权限。您必须根据您的用例自定义允许的 S3 操作。例如,如果用户必须复制具有对象标签的对象,则您还必须授予 s3:GetObjectTagging 的权限。

  1. 配置 IAM policy 和存储桶策略后,来自源账户的 IAM 身份必须将对象上传到目标存储桶。确保 ACL 设置为存储桶拥有者完全控制。例如,源 IAM 身份必须运行带有 --acl 选项的 cp AWS CLI 命令:
aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control

**注意:**如果您在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

当您将“S3 对象所有权”设置为“首选桶拥有者”时,您上传的具有存储桶拥有者完全控制的对象将归属于目标存储桶的账户。

**重要信息:**如果您的 S3 存储桶在激活 WS Key Management Service (AWS KMS) 的情况下进行了默认加密,则您还必须修改 AWS KMS 密钥权限。有关说明,请参阅我的 Amazon S3 存储桶使用自定义 AWS KMS 密钥进行默认加密。如何允许用户在存储桶上传和下载内容?

相关信息

存储桶拥有者授予跨账户存储桶权限

如何在其他 AWS 账户上传对象之际更改 Amazon S3 存储桶的对象所有权?

使用基于资源的策略委托对另一个账户中的 Amazon S3 存储桶的访问权限

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