当源存储桶和目标存储桶由不同账户拥有时更改副本所有权 - Amazon Simple Storage Service

当源存储桶和目标存储桶由不同账户拥有时更改副本所有权

当复制配置中的存储桶和目标存储桶由不同的 AWS 账户拥有时,您可以指示 Amazon S3 将副本所有权更改为拥有目标存储桶的 AWS 账户。此示例介绍如何使用 Amazon S3 控制台和 AWS CLI 更改副本所有权。有关更多信息,请参阅更改副本拥有者

注意

当您使用 S3 副本,且源和目标存储桶由不同的 AWS 账户 拥有时,目标存储桶的存储桶拥有者可以禁用 ACL(通过对象所有权的强制存储桶拥有者设置)以将副本拥有权更改为拥有目标存储桶的 AWS 账户。此设置模拟现有的所有者覆盖行为,而无需 s3:ObjectOwnerOverrideToBucketOwner 权限。这意味着,在强制存储桶拥有者设置的情况下已复制到目标存储桶的所有对象都归目标存储桶拥有者所有。有关对象所有权的更多信息,请参阅为您的存储桶控制对象所有权和禁用 ACL。

有关在跨账户场景中使用 AWS Key Management Service 服务器端加密配置复制的更多信息,请参阅 为跨账户方案授予其他权限

如需分步指导,请参阅 为同一账户拥有的源存储桶和目标存储桶配置复制。本主题提供了在两个存储桶由相同和不同的 AWS 账户拥有时如何设置复制配置的说明。

要使用 AWS CLI 更改副本所有权,您需要创建存储桶,对存储桶启用版本控制,创建一个 IAM 角色,该角色向 Amazon S3 赋予复制对象并将复制配置添加到源存储桶的权限。在复制配置中,指示 Amazon S3 更改副本拥有者。此外,您还将测试该设置。

当源存储桶和目标存储桶由不同的 AWS 账户(AWS CLI)拥有时更改副本所有权
  1. 在此示例中,您将在两个不同的 AWS 账户 中创建 source(源)存储桶和 destination(目标)存储桶。使用两个命名配置文件配置 AWS CLI。此示例分别使用名为 acctAacctB 的配置文件。有关设置凭证配置文件的更多信息,请参阅《AWS Command Line Interface 用户指南》中的命名配置文件

    重要

    用于此练习的配置文件必须具有必要的权限。例如,在复制配置中,指定 Amazon S3 可担任的 IAM 角色。仅当您所使用的配置文件具有 iam:PassRole 权限时,您才能执行此操作。如果您使用管理员用户凭证创建命名配置文件,则可执行所有任务。有关更多信息,请参阅 IAM 用户指南中的向用户授予将角色传递给 AWS 服务的权限

    您将需要确保这些配置文件具有必要的权限。例如,复制配置包含 Amazon S3 可担任的 IAM 角色。仅当您所使用的命名配置文件具有 iam:PassRole 权限时,它才能将此类配置附加到存储桶。如果您在创建这些命名配置文件时指定管理员用户凭证,则这些配置文件都将具有权限。有关更多信息,请参阅 IAM 用户指南中的向用户授予将角色传递给 AWS 服务的权限

  2. 创建存储桶,并启用版本控制。此示例在美国东部(弗吉尼亚州北部)(us-east-1)区域中创建存储桶。

    aws s3api create-bucket \ --bucket source \ --region us-east-1 \ --profile acctA
    aws s3api put-bucket-versioning \ --bucket source \ --versioning-configuration Status=Enabled \ --profile acctA
  3. 创建一个目标存储桶,并启用版本控制。此示例在美国西部(俄勒冈州)(us-west-2)区域中创建目标存储桶。使用不同于用于 source(源)存储桶的AWS 账户配置文件。

    aws s3api create-bucket \ --bucket destination \ --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2 \ --profile acctB
    aws s3api put-bucket-versioning \ --bucket destination \ --versioning-configuration Status=Enabled \ --profile acctB
  4. 您必须添加权限到目标存储桶策略以允许更改副本所有权。

    1. 将以下策略保存到 destination-bucket-policy.json

      { "Version": "2012-10-17", "Statement": [ { "Sid": "destination_bucket_policy_sid", "Principal": { "AWS": "source-bucket-owner-account-id" }, "Action": [ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ObjectOwnerOverrideToBucketOwner", "s3:ReplicateTags", "s3:GetObjectVersionTagging" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::destination/*" ] } ] }
    2. 将以上策略放置到目标存储桶:

      aws s3api put-bucket-policy --region $ {destination_region} --bucket $ {destination} --policy file://destination_bucket_policy.json
  5. 创建一个 IAM 角色。您将在稍后添加到存储桶的复制配置中指定此角色。Amazon S3 担任此角色以代表您复制对象。分两个步骤创建 IAM 角色:

    • 创建角色。

    • 将权限策略附加到角色。

    1. 创建一个 IAM 角色。

      1. 复制以下信任策略,并将其保存到本地计算机上当前目录中一个名为 s3-role-trust-policy.json 的文件。此策略会向 Amazon S3 授予担任该角色的权限。

        { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
      2. 运行以下 AWS CLI 命令以创建角色。

        $ aws iam create-role \ --role-name replicationRole \ --assume-role-policy-document file://s3-role-trust-policy.json \ --profile acctA
    2. 将权限策略附加到角色。

      1. 复制以下权限策略,并将其保存到本地计算机上当前目录中一个名为 s3-role-perm-pol-changeowner.json 的文件。此策略授予对各种 Amazon S3 存储桶和对象操作的权限。在以下步骤中,您将创建一个 IAM 角色并将此策略附加到该角色。

        { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws:s3:::source/*" ] }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetReplicationConfiguration" ], "Resource":[ "arn:aws:s3:::source" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ObjectOwnerOverrideToBucketOwner", "s3:ReplicateTags", "s3:GetObjectVersionTagging" ], "Resource":"arn:aws:s3:::destination/*" } ] }
      2. 要创建策略并将其附加到角色,请运行以下命令。

        $ aws iam put-role-policy \ --role-name replicationRole \ --policy-document file://s3-role-perm-pol-changeowner.json \ --policy-name replicationRolechangeownerPolicy \ --profile acctA
  6. 向源存储桶添加复制配置。

    1. AWS CLI 要求以 JSON 形式指定复制配置。将以下 JSON 保存到本地计算机上当前目录中一个名为 replication.json 的文件。在配置中,添加 AccessControlTranslation 以指示副本所有权的更改。

      { "Role":"IAM-role-ARN", "Rules":[ { "Status":"Enabled", "Priority":1, "DeleteMarkerReplication":{ "Status":"Disabled" }, "Filter":{ }, "Status":"Enabled", "Destination":{ "Bucket":"arn:aws:s3:::destination", "Account":"destination-bucket-owner-account-id", "AccessControlTranslation":{ "Owner":"Destination" } } } ] }
    2. 编辑 JSON,即提供目标存储桶拥有者账户 ID 和 IAM-role-ARN 的值。保存更改。

    3. 要向源存储桶添加复制配置,请运行以下命令。提供存储桶名称。

      $ aws s3api put-bucket-replication \ --replication-configuration file://replication.json \ --bucket source \ --profile acctA
  7. 在 Amazon S3 控制台中检查副本所有权。

    1. 登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

    2. 将对象添加到存储桶。确认 destination(目标)存储桶包含对象副本,并且该副本的所有权已更改为拥有 destination(目标)存储桶的AWS 账户。

有关添加复制配置的代码示例,请参阅 使用 AWS SDK。您将需要适当地修改复制配置。有关概念性信息,请参阅 更改副本拥有者