

# 为实时复制设置权限
<a name="setting-repl-config-perm-overview"></a>

在 Amazon S3 中设置实时复制时，您必须获取必要的权限，如下所示：
+ 您必须向将要创建复制规则的 AWS Identity and Access Management（IAM）主体（用户或角色）授予一组特定的权限。
+ Amazon S3 需要代表您复制对象的权限。您通过创建一个 IAM 角色，然后在复制配置中指定该角色，授予这些权限。
+ 当源存储桶与目标存储桶不是由相同账户拥有时，目标存储桶的拥有者还必须向源存储桶拥有者授予存储副本的权限。

**注意**  
如果您使用 S3 批量操作来按需复制对象，而不是设置实时复制，则 S3 批量复制需要不同的 IAM 角色和策略。有关批量复制 IAM 角色和策略示例，请参阅[配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。

**Topics**
+ [步骤 1：向正在创建复制规则的 IAM 主体授予权限](#setting-repl-config-role)
+ [步骤 2：创建供 Amazon S3 代入的 IAM 角色](#setting-repl-config-same-acctowner)
+ [（可选）步骤 3：在源存储桶和目标存储桶由不同的 AWS 账户拥有时授予权限](#setting-repl-config-crossacct)
+ [（可选）步骤 4：授予更改副本所有权的权限](#change-replica-ownership)

## 步骤 1：向正在创建复制规则的 IAM 主体授予权限
<a name="setting-repl-config-role"></a>

您将用于创建复制规则的 IAM 用户或角色需要相应的权限，才能为单向或双向复制创建复制规则。如果用户或角色没有这些权限，您将无法创建复制规则。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 身份](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。

用户或角色需要执行以下操作：
+ `iam:AttachRolePolicy`
+ `iam:CreatePolicy`
+ `iam:CreateServiceLinkedRole`
+ `iam:PassRole`
+ `iam:PutRolePolicy`
+ `s3:GetBucketVersioning`
+ `s3:GetObjectVersionAcl`
+ `s3:GetObjectVersionForReplication`
+ `s3:GetReplicationConfiguration`
+ `s3:PutReplicationConfiguration`

以下是包含这些操作的示例 IAM 策略。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetAccessPoint",
                "s3:GetAccountPublicAccessBlock",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation",
                "s3:GetBucketPolicyStatus",
                "s3:GetBucketPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets",
                "s3:PutReplicationConfiguration",
                "s3:GetReplicationConfiguration",
                "s3:GetBucketVersioning",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionAcl",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetObjectVersion",
                "s3:GetBucketOwnershipControls",
                "s3:PutBucketOwnershipControls",
                "s3:GetObjectLegalHold",
                "s3:GetObjectRetention",
                "s3:GetBucketObjectLockConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1-*",
                "arn:aws:s3:::amzn-s3-demo-bucket2-*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*AccessPoint*",
                "s3:GetMultiRegion*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:Get*",
                "iam:CreateServiceLinkedRole",
                "iam:CreateRole",
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::*:role/service-role/s3*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:List*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:CreatePolicy"
              ],
            "Resource": [
                "arn:aws:iam::*:policy/service-role/s3*",
                "arn:aws:iam::*:role/service-role/s3*"
            ]
        }
    ]
}
```

------

## 步骤 2：创建供 Amazon S3 代入的 IAM 角色
<a name="setting-repl-config-same-acctowner"></a>



默认情况下，所有 Amazon S3 资源（存储桶、对象和相关子资源）都是私有的，只有资源拥有者可以访问相应的资源。Amazon S3 需要权限才能从源存储桶读取和复制对象。您通过创建一个 IAM 角色，并在复制配置中指定该角色，来授予这些权限。

本节解释了附加到此 IAM 角色的信任策略和最低所需权限策略。示例演练提供创建 IAM 角色的分步说明。有关更多信息，请参阅 [配置实时复制的示例](replication-example-walkthroughs.md)。

**注意**  
如果您使用控制台创建复制配置，我们建议您跳过本节，改为让控制台为您创建此 IAM 角色以及必要的信任和权限策略。

*信任策略*确定哪些主体身份可以担任此 IAM 角色。*权限策略*指定 IAM 角色可在什么条件下对哪些资源执行哪些操作。
+ 以下示例显示了一个*信任策略*，您在其中将 Amazon S3 标识为可担任此角色的 AWS 服务主体。

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

****  

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

------
+ 以下示例显示了一个*信任策略*，您在其中将 Amazon S3 和 S3 批量操作标识为可担任此角色的服务主体。如果您正在创建批量复制任务，则使用此方法。有关更多信息，请参阅 [为新的复制规则或目标创建批量复制任务](s3-batch-replication-new-config.md)。

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

****  

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

------

  有关 IAM 角色的更多信息，请参阅《IAM 用户指南》**中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。
+ 以下示例显示了*权限策略*，您在其中向 IAM 角色授予代表您执行复制任务的权限。当 Amazon S3 担任角色时，它将具有您在此策略中指定的权限。在此策略中，`{{amzn-s3-demo-source-bucket}}` 是源存储桶，`{{amzn-s3-demo-destination-bucket}}` 是目标存储桶。

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

****  

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

------

  此权限策略授予执行以下操作的权限：
  +  `s3:GetReplicationConfiguration` 和 `s3:ListBucket` – 对 `{{amzn-s3-demo-source-bucket}}` 存储桶执行这些操作的权限可让 Amazon S3 检索复制配置和列出存储桶内容。（当前权限模型需要 `s3:ListBucket` 权限来访问删除标记）。
  + `s3:GetObjectVersionForReplication` 和 `s3:GetObjectVersionAcl` – 针对所有对象授予的这些操作的权限允许 Amazon S3 获取特定对象版本和对象关联的访问控制列表 (ACL)。

    
  + `s3:ReplicateObject` 和 `s3:ReplicateDelete` – `{{amzn-s3-demo-destination-bucket}}` 存储桶中所有对象上的这些操作的权限允许 Amazon S3 将对象或删除标记复制到目标存储桶。有关删除标记的信息，请参阅 [删除操作对复制操作有何影响](replication-what-is-isnot-replicated.md#replication-delete-op)。
**注意**  
对 `{{amzn-s3-demo-destination-bucket}}` 存储桶执行 `s3:ReplicateObject` 操作的权限还支持复制元数据，例如对象标签和 ACL。因此，您无需显式授予执行 `s3:ReplicateTags` 操作的权限。
  + `s3:GetObjectVersionTagging` – 对 `{{amzn-s3-demo-source-bucket}}` 存储桶中的对象执行此操作的权限可让 Amazon S3 读取用于复制的对象标签。有关对象标签的更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。如果 Amazon S3 没有 `s3:GetObjectVersionTagging` 权限，它将复制对象，而不是对象标签。

  有关 Amazon S3 操作的列表，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#list_amazons3-actions-as-permissions)。

  有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。
**重要**  
拥有 IAM 角色的 AWS 账户 必须拥有其向 IAM 角色授予的操作的权限。  
例如，假定源存储桶包含由另一个 AWS 账户 拥有的对象。对象的拥有者必须通过对象的访问控制列表（ACL），向拥有 IAM 角色的 AWS 账户显式授予必要的权限。否则，Amazon S3 无法访问这些对象，因而这些对象的复制将失败。有关 ACL 权限的信息，请参阅 [访问控制列表 (ACL) 概述](acl-overview.md)。  
  
此处介绍的权限与最低复制配置相关。如果您选择添加可选复制配置，则必须向 Amazon S3 授予其它权限：  
要复制加密的对象，还需要授予必要的 AWS Key Management Service（AWS KMS）密钥权限。有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。
要将对象锁定与复制功能结合使用，您必须在用于设置复制的 AWS Identity and Access Management（IAM）角色中，授予对源 S3 存储桶的两项额外的权限。这两项额外的权限是 `s3:GetObjectRetention` 和 `s3:GetObjectLegalHold`。如果角色已有 `s3:Get*` 权限声明，则该声明已满足要求。有关更多信息，请参阅 [将对象锁定与 S3 复制结合使用](object-lock-managing.md#object-lock-managing-replication)。

## （可选）步骤 3：在源存储桶和目标存储桶由不同的 AWS 账户拥有时授予权限
<a name="setting-repl-config-crossacct"></a>

当源存储桶和目标存储桶不是由相同的账户拥有时，目标存储桶的拥有者还必须添加一个存储桶策略，来向源存储桶的拥有者授予执行复制操作的权限，如下面的示例所示。在此示例策略中，`{{amzn-s3-demo-destination-bucket}}` 是目标存储桶。

还可以使用 Amazon S3 控制台来自动为您生成此存储桶策略。有关更多信息，请参阅[启用从源存储桶接收复制的对象](#receiving-replicated-objects)。

**注意**  
角色的 ARN 格式可能看起来不同。如果使用控制台创建角色，则 ARN 格式为 `arn:aws:iam::{{account-ID}}:role/service-role/{{role-name}}`。如果使用 AWS CLI 创建角色，则 ARN 格式为 `arn:aws:iam::{{account-ID}}:role/{{role-name}}`。有关更多信息，请参阅 *IAM 用户指南*中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "PolicyForDestinationBucket",
    "Statement": [
        {
            "Sid": "Permissions on objects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{{111122223333}}:{{role/service-role/source-account-IAM-role}}"
            },
            "Action": [
                "s3:ReplicateDelete",
                "s3:ReplicateObject"
            ],
            "Resource": "arn:aws:s3:::{{amzn-s3-demo-destination-bucket}}/*"
        },
        {
            "Sid": "Permissions on bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{{111122223333}}:{{role/service-role/source-account-IAM-role}}"
            },
            "Action": [
                "s3:List*",
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::{{amzn-s3-demo-destination-bucket}}"
        }
    ]
}
```

------

有关示例，请参阅[针对不同账户中的存储桶配置复制](replication-walkthrough-2.md)。

如果向源存储桶中的对象添加标签，请注意以下事项：
+ 如果源存储桶拥有者向 Amazon S3 授予 `s3:GetObjectVersionTagging` 和 `s3:ReplicateTags` 操作的权限来复制对象标签（通过 IAM 角色），则 Amazon S3 将复制标签以及对象。有关 IAM 角色的信息，请参阅 [步骤 2：创建供 Amazon S3 代入的 IAM 角色](#setting-repl-config-same-acctowner)。
+ 如果目标存储桶的所有者不希望复制标签，则他们可以向目标存储桶策略添加以下语句来显式拒绝 `s3:ReplicateTags` 操作的权限。在此策略中，`{{amzn-s3-demo-destination-bucket}}` 是目标存储桶。

  ```
  ...
     "Statement":[
        {
           "Effect":"Deny",
           "Principal":{
              "AWS":"arn:aws:iam::{{source-bucket-account-id}}:{{role/service-role/source-account-IAM-role}}"
           },
           "Action":"s3:ReplicateTags",
           "Resource":"arn:aws:s3:::{{amzn-s3-demo-destination-bucket}}/*"
        }
     ]
  ...
  ```

**注意**  
如果要复制加密的对象，还必须授予必要的 AWS Key Management Service（AWS KMS）密钥权限。有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。
要将对象锁定与复制功能结合使用，您必须在用于设置复制的 AWS Identity and Access Management（IAM）角色中，授予对源 S3 存储桶的两项额外的权限。这两项额外的权限是 `s3:GetObjectRetention` 和 `s3:GetObjectLegalHold`。如果角色已有 `s3:Get*` 权限声明，则该声明已满足要求。有关更多信息，请参阅 [将对象锁定与 S3 复制结合使用](object-lock-managing.md#object-lock-managing-replication)。

**启用从源存储桶接收复制的对象**  
您可以快速生成所需的策略，以便启用通过 Amazon S3 控制台从源存储桶接收复制的对象，而不是手动将上述策略添加到目标存储桶中。

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

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择要用作目标存储桶的存储桶。

1. 选择 **Management**（管理）选项卡，然后向下滚动到 **Replication rules**（复制规则）。

1. 对于 **Actions**（操作），选择 **Receive replicated objects**（接收复制的对象）。

   按照提示进行操作并输入源存储桶账户的 AWS 账户 ID，然后选择**生成策略**。控制台将生成 Amazon S3 存储桶策略和 KMS 密钥策略。

1. 要将此策略添加到现有存储桶策略中，请选择 **Apply settings**（应用设置），或者选择 **Copy**（复制）以手动复制更改。

1. （可选）在 AWS Key Management Service 控制台中将 AWS KMS 策略复制到所需的 KMS 密钥策略。

## （可选）步骤 4：授予更改副本所有权的权限
<a name="change-replica-ownership"></a>

当源存储桶和目标存储桶由不同的 AWS 账户 拥有时，您可以指示 Amazon S3 将副本的所有权更改为拥有目标存储桶的 AWS 账户。要覆盖副本的所有权，您必须授予一些额外的权限或调整目标存储桶的 S3 对象所有权设置。有关拥有者覆盖的更多信息，请参阅[更改副本拥有者](replication-change-owner.md)。