

# 更改副本拥有者
更改副本拥有者

在复制中，默认情况下，源对象的拥有者也拥有副本。但是，当源存储桶和目标存储桶由不同的 Amazon Web Services 账户拥有时，您可能想要更改副本所有权。例如，您可能想要更改所有权，来限制对于对象副本的访问权限。在复制配置中，可以添加可选的配置设置，来将副本所有权更改为拥有目标存储桶的 Amazon Web Services 账户。

要更改副本拥有者，请执行以下操作：
+ 将*拥有者覆盖* 选项添加到复制配置，来指示 Amazon S3 更改副本所有权。
+ 向 Amazon S3 授予更改副本所有权的 `s3:ObjectOwnerOverrideToBucketOwner` 权限。
+ 在目标存储桶策略中添加支持更改副本所有权的 `s3:ObjectOwnerOverrideToBucketOwner` 权限。`s3:ObjectOwnerOverrideToBucketOwner` 权限可让目标存储桶的拥有者接受对象副本的所有权。

有关更多信息，请参阅[所有权覆盖选项的注意事项](#repl-ownership-considerations)和[向复制配置添加拥有者覆盖选项](#repl-ownership-owneroverride-option)。有关带分步说明的有效示例，请参阅[如何更改副本拥有者](#replication-walkthrough-3)。

**重要**  
您可以为对象所有权使用“强制存储桶拥有者”设置，而不是使用拥有者覆盖选项。当您使用复制且源存储桶和目标存储桶由不同的 Amazon Web Services 账户拥有时，目标存储桶的存储桶拥有者可以为对象所有权使用“强制存储桶拥有者”设置，来将副本所有权更改为拥有目标存储桶的 Amazon Web Services 账户。此设置将禁用对象访问控制列表（ACL)。  
“强制存储桶拥有者”设置模拟现有的拥有者覆盖行为，而无需 `s3:ObjectOwnerOverrideToBucketOwner` 权限。在桶拥有者强制设置的情况下已复制到目标桶的所有对象都归目标桶拥有者所有。有关对象所有权的更多信息，请参阅[为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

## 所有权覆盖选项的注意事项


当您配置所有权覆盖选项时，请注意以下几点：
+ 默认情况下，源对象的拥有者也拥有副本。Amazon S3 复制对象版本及其关联的 ACL。

  如果您向复制配置中添加拥有者覆盖选项，Amazon S3 将仅复制对象版本，而不复制 ACL。此外，Amazon S3 不会复制对源对象 ACL 的任何后续更改。Amazon S3 在副本上设置 ACL，将完全控制权限授予目标存储桶拥有者。
+  当您更新复制配置来启用或禁用拥有者覆盖时，会发生以下行为：
  + 如果向复制配置添加拥有者覆盖选项：

    当 Amazon S3 复制对象版本时，它会放弃与源对象关联的 ACL。而是 Amazon S3 改为在副本上设置 ACL，将完全控制权限授予目标存储桶的拥有者。Amazon S3 不会复制对源对象 ACL 的任何后续更改。但是，此 ACL 更改不会应用于设置拥有者覆盖选项之前已复制的对象版本。设置拥有者覆盖之前所复制的源对象 ACL 上的任何更新仍将继续复制（因为对象及其副本继续具有相同的拥有者）。
  + 如果从复制配置中删除拥有者覆盖选项：

    Amazon S3 将源存储桶中出现的新对象及其关联的 ACL 复制到目标存储桶。对于删除拥有者覆盖之前已复制的对象，Amazon S3 不会复制其 ACL，因为 Amazon S3 进行的对象所有权更改仍保持有效。也就是说，对于在您设置了拥有者覆盖的情况下所复制的对象版本上的 ACL，接下来不会进行复制。

## 向复制配置添加拥有者覆盖选项


**警告**  
仅在源存储桶和目标存储桶由不同 Amazon Web Services 账户拥有时添加拥有者覆盖选项。Amazon S3 不会检查存储桶由相同账户还是不同账户拥有。如果您在两个存储桶均由同一 Amazon Web Services 账户拥有时添加拥有者覆盖，Amazon S3 会应用拥有者覆盖。此选项向目标存储桶的拥有者授予完全权限，并且不会将后续更新复制到源对象的访问控制列表（ACL）。副本拥有者可以使用 `PutObjectAcl` 请求直接更改与副本关联的 ACL，但不能通过复制进行更改。

要指定拥有者覆盖选项，请向每个 `Destination` 元素添加以下元素：
+ `AccessControlTranslation` 元素，指示 Amazon S3 更改副本所有权
+ `Account` 元素，指定目标存储桶拥有者的 Amazon Web Services 账户 

```
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    ...
    <Destination>
      ...
      <AccessControlTranslation>
           <Owner>Destination</Owner>
       </AccessControlTranslation>
      <Account>destination-bucket-owner-account-id</Account>
    </Destination>
  </Rule>
</ReplicationConfiguration>
```

以下复制配置示例指示 Amazon S3 将键前缀为 *`Tax`* 的对象复制到 `amzn-s3-demo-destination-bucket` 目标存储桶，并更改副本的所有权。要使用此示例，请将 `user input placeholders` 替换为您自己的信息。

```
<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
   <Role>arn:aws:iam::account-id:role/role-name</Role>
   <Rule>
      <ID>Rule-1</ID>
      <Priority>1</Priority>
      <Status>Enabled</Status>
      <DeleteMarkerReplication>
         <Status>Disabled</Status>
      </DeleteMarkerReplication>
      <Filter>
         <Prefix>Tax</Prefix>
      </Filter>
      <Destination>
         <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
         <Account>destination-bucket-owner-account-id</Account>
         <AccessControlTranslation>
            <Owner>Destination</Owner>
         </AccessControlTranslation>
      </Destination>
   </Rule>
</ReplicationConfiguration>
```

## 向 Amazon S3 授予更改副本所有权的权限


通过在与 Amazon Identity and Access Management（IAM）角色关联的权限策略中添加 `s3:ObjectOwnerOverrideToBucketOwner` 操作的权限，可向 Amazon S3 授予更改副本所有权的权限。此角色是在复制配置中指定的 IAM 角色，可让 Amazon S3 担任该角色并代表您复制对象。要使用以下示例，请将 `amzn-s3-demo-destination-bucket` 替换为目标存储桶的名称。

```
...
{
    "Effect":"Allow",
         "Action":[
       "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}
...
```

## 在目标存储桶策略中添加允许更改副本所有权的权限


目标存储桶的拥有者必须向源存储桶的拥有者授予更改副本所有权的权限。目标存储桶的拥有者向源存储桶的拥有者授予 `s3:ObjectOwnerOverrideToBucketOwner` 操作的权限。此权限可让目标存储桶拥有者接受对象副本的所有权。以下示例存储桶策略语句说明如何执行此操作。要使用此示例，请将 `user input placeholders` 替换为您自己的信息。

```
...
{
    "Sid":"1",
    "Effect":"Allow",
    "Principal":{"AWS":"source-bucket-account-id"},
    "Action":["s3:ObjectOwnerOverrideToBucketOwner"],
    "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}
...
```

## 如何更改副本拥有者
如何更改副本拥有者

当复制配置中的源存储桶和目标存储桶由不同的 Amazon Web Services 账户拥有时，可以指示 Amazon S3 将副本所有权更改为拥有目标存储桶的 Amazon Web Services 账户。以下示例显示如何使用 Amazon S3 控制台、Amazon Command Line Interface（Amazon CLI）和 Amazon SDK 来更改副本所有权。

### 使用 S3 控制台


如需分步指导，请参阅 [针对同一账户中的存储桶配置复制](replication-walkthrough1.md)。本主题提供了在源存储桶和目标存储桶由相同和不同的 Amazon Web Services 账户拥有时设置复制配置的说明。

### 使用 Amazon CLI


以下过程介绍如何使用 Amazon CLI 更改副本所有权。在此过程中，您将执行以下操作：
+ 创建源存储桶和目标存储桶。
+ 对存储桶启用版本控制。
+ 创建 Amazon Identity and Access Management（IAM）角色来向 Amazon S3 授予复制对象的权限。
+ 将复制配置添加到源存储桶。
+ 在复制配置中，指示 Amazon S3 更改副本所有权。
+ 您需要测试复制配置。

**当源存储桶和目标存储桶由不同的 Amazon Web Services 账户拥有时更改副本所有权（Amazon CLI）**

要在此过程中使用示例 Amazon CLI 命令，请将 `user input placeholders` 替换为您自己的信息。

1. 在此示例中，您将在两个不同的 Amazon Web Services 账户中创建源存储桶和目标存储桶。要使用这两个账户，请使用两个命名配置文件配置 Amazon CLI。此示例分别使用名为 *`acctA`* 和 *`acctB`* 的配置文件。有关设置凭证配置文件和使用命名配置文件的信息，请参阅《Amazon Command Line Interface 用户指南》**中的 [Configuration and credential file settings](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-files.html)。
**重要**  
用于此过程的配置文件必须具有必要的权限。例如，在复制配置中，指定 Amazon S3 可担任的 IAM 角色。仅当您使用的配置文件具有 `iam:PassRole` 权限时，才能执行此操作。如果您使用管理员用户凭证来创建命名配置文件，则可以执行此过程中的所有任务。有关更多信息，请参阅《IAM 用户指南》**中的[向用户授予将角色传递给 Amazon Web Services 服务的权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_passrole.html)。

1. 创建源存储桶，并启用版本控制。此示例在美国东部（弗吉尼亚州北部）(`us-east-1`) 区域中创建名为 `amzn-s3-demo-source-bucket` 的源存储桶。

   ```
   aws s3api create-bucket \
   --bucket amzn-s3-demo-source-bucket \
   --region us-east-1 \
   --profile acctA
   ```

   ```
   aws s3api put-bucket-versioning \
   --bucket amzn-s3-demo-source-bucket \
   --versioning-configuration Status=Enabled \
   --profile acctA
   ```

1. 创建一个目标存储桶，并启用版本控制。此示例在美国西部（俄勒冈州）(`us-west-2`) 区域中创建名为 `amzn-s3-demo-destination-bucket` 的目标存储桶。使用的 Amazon Web Services 账户配置文件应与您用于源存储桶的配置文件不同。

   ```
   aws s3api create-bucket \
   --bucket amzn-s3-demo-destination-bucket \
   --region us-west-2 \
   --create-bucket-configuration LocationConstraint=us-west-2 \
   --profile acctB
   ```

   ```
   aws s3api put-bucket-versioning \
   --bucket amzn-s3-demo-destination-bucket \
   --versioning-configuration Status=Enabled \
   --profile acctB
   ```

1. 您必须添加权限到目标存储桶策略以允许更改副本所有权。

   1.  将以下策略保存到名为 `destination-bucket-policy.json` 的文件中。确保将 *`user input placeholders`* 替换为您自己的信息。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "destination_bucket_policy_sid",
                  "Principal": {
                      "AWS": "source-bucket-owner-123456789012"
                  },
                  "Action": [
                      "s3:ReplicateObject",
                      "s3:ReplicateDelete",
                      "s3:ObjectOwnerOverrideToBucketOwner",
                      "s3:ReplicateTags",
                      "s3:GetObjectVersionTagging"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
                  ]
              }
          ]
      }
      ```

------

   1. 使用以下 `put-bucket-policy` 命令将上述策略添加到目标存储桶：

      ```
      aws s3api put-bucket-policy --region $ {destination-region} --bucket $ {amzn-s3-demo-destination-bucket} --policy file://destination_bucket_policy.json
      ```

1. 创建一个 IAM 角色。您将在稍后添加到源存储桶的复制配置中指定此角色。Amazon S3 担任此角色以代表您复制对象。分两个步骤创建 IAM 角色：
   + 创建角色。
   + 将权限策略附加到角色。

   1. 创建 IAM 角色。

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

------
#### [ JSON ]

****  

         ```
         {
            "Version":"2012-10-17",		 	 	 
            "Statement":[
               {
                  "Effect":"Allow",
                  "Principal":{
                     "Service":"s3.amazonaws.com"
                  },
                  "Action":"sts:AssumeRole"
               }
            ]
         }
         ```

------

      1. 运行以下 Amazon CLI `create-role` 命令来创建 IAM 角色：

         ```
         $ aws iam create-role \
         --role-name replicationRole \
         --assume-role-policy-document file://s3-role-trust-policy.json  \
         --profile acctA
         ```

         记下您创建的 IAM 角色的 Amazon 资源名称（ARN）。您将在后面的步骤中用到此 ARN。

   1. 将权限策略附加到角色。

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

------
#### [ JSON ]

****  

         ```
         {
            "Version":"2012-10-17",		 	 	 
            "Statement":[
               {
                  "Effect":"Allow",
                  "Action":[
                     "s3:GetObjectVersionForReplication",
                     "s3:GetObjectVersionAcl"
                  ],
                  "Resource":[
                     "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
                  ]
               },
               {
                  "Effect":"Allow",
                  "Action":[
                     "s3:ListBucket",
                     "s3:GetReplicationConfiguration"
                  ],
                  "Resource":[
                     "arn:aws:s3:::amzn-s3-demo-source-bucket"
                  ]
               },
               {
                  "Effect":"Allow",
                  "Action":[
                     "s3:ReplicateObject",
                     "s3:ReplicateDelete",
                     "s3:ObjectOwnerOverrideToBucketOwner",
                     "s3:ReplicateTags",
                     "s3:GetObjectVersionTagging"
                  ],
                  "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
               }
            ]
         }
         ```

------

      1. 要将前面的权限策略附加到该角色，请运行以下 `put-role-policy` 命令：

         ```
         $ aws iam put-role-policy \
         --role-name replicationRole \
         --policy-document file://s3-role-perm-pol-changeowner.json \
         --policy-name replicationRolechangeownerPolicy \
         --profile acctA
         ```

1. 向源存储桶添加复制配置。

   1. Amazon 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:::amzn-s3-demo-destination-bucket",
                  "Account":"destination-bucket-owner-account-id",
                  "AccessControlTranslation":{
                     "Owner":"Destination"
                  }
               }
            }
         ]
      }
      ```

   1. 编辑 JSON，即提供目标存储桶名称、目标存储桶拥有者账户 ID 和 `IAM-role-ARN` 的值。将 *`IAM-role-ARN`* 替换为您之前创建的 IAM 角色的 ARN。保存更改。

   1. 要向源存储桶添加复制配置，请运行以下命令：

      ```
      $ aws s3api put-bucket-replication \
      --replication-configuration file://replication.json \
      --bucket amzn-s3-demo-source-bucket \
      --profile acctA
      ```

1. 通过在 Amazon S3 控制台中检查副本所有权，来测试复制配置。

   1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

   1. 将对象添加到源存储桶。验证目标存储桶包含对象副本，并且该副本的所有权已更改为拥有目标存储桶的 Amazon Web Services 账户。

### 使用 Amazon SDK


 有关添加复制配置的代码示例，请参阅[使用 Amazon SDK](replication-walkthrough1.md#replication-ex1-sdk)。您必须适当地修改复制配置。有关概念性信息，请参阅 [更改副本拥有者](#replication-change-owner)。