

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色
<a name="emr-emrfs-iam-roles"></a>

**注意**  
在 Amazon EMR 6.15.0 中引入 Amazon S3 Access Grants 后，本页所述的 EMRFS 角色映射功能得到了改进。要对您在 Amazon S3 中的数据使用可扩展访问控制解决方案，我们建议您[将 S3 Access Grants 与 Amazon EMR 结合使用](emr-access-grants.md)。

当在集群上运行的应用程序引用使用 `s3://{{mydata}}` 格式的数据时，Amazon EMR 使用 EMRFS 发出请求。为了与 Amazon S3 交互，EMRFS 会代入附加到您的 [Amazon EC2 实例配置文件](emr-iam-role-for-ec2.md)的权限策略。无论运行应用程序的用户或组或数据在 Amazon S3 中的位置如何，都会使用相同的 Amazon EC2 实例配置文件。

如果您的集群中有多个用户需要通过 EMRFS 对 Amazon S3 中的数据进行不同级别的访问，则可以为 EMRFS 设置具有 IAM 角色的安全配置。EMRFS 可以根据发出请求的用户或组，或基于数据在 Amazon S3 中的位置，为集群 EC2 实例代入不同的服务角色。EMRFS 的每个 IAM 角色都可以对 Amazon S3 中的数据具有不同访问权限。有关针对集群 EC2 实例的服务角色更多信息，请参阅 [集群 EC2 实例（EC2 实例配置文件）的服务角色](emr-iam-role-for-ec2.md)。

Amazon EMR 版本 5.10.0 和更高版本支持为 EMRFS 使用自定义 IAM 角色。如果您使用的是早期版本或有 EMRFS 的 IAM 角色无法满足的其它要求，可以创建自定义凭证提供程序。有关更多信息，请参阅[授权访问 Amazon S3 中的 EMRFS 数据](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-plan-credentialsprovider)。

当您使用安全配置为 EMRFS 指定 IAM 角色时，请设置角色映射。每个角色映射都指定与标识符对应的 IAM 角色。这些标识符确定通过 EMRFS 访问 Amazon S3 的基础。标识符可以是用户、组或指示数据位置的 Amazon S3 前缀。当 EMRFS 向 Amazon S3 发出请求时，如果请求与访问基础匹配，则 EMRFS 让集群 EC2 实例代入与该请求对应的 IAM 角色。对于集群 EC2 实例，应用的是附加在该角色上的 IAM 权限，而不是附加在服务角色上的 IAM 权限。

角色映射中的用户和组是在集群上定义的 Hadoop 用户和组。用户和组将传递到使用 EMRFS 的应用程序的上下文中的 EMRFS (例如，YARN 用户模拟)。Amazon S3 前缀可以是任意深度的存储桶说明符（例如，`s3://amzn-s3-demo-bucket` 或 `s3://amzn-s3-demo-bucket/myproject/mydata`）。您可以在单个角色映射中指定多个标识符，但它们必须是同一类型。

**重要**  
EMRFS 的 IAM 角色在应用程序的各用户之间提供应用程序级别的隔离。它不提供主机上各用户之间的主机级别的隔离。任何有权访问集群的用户都可以绕过隔离以代入任何角色。

当集群应用程序通过 EMRFS 向 Amazon S3 发出请求时，EMRFS 按角色映射在安全配置中出现的先后顺序评估角色映射。如果通过 EMRFS 发出的请求与任何标识符都不匹配，EMRFS 将回退到使用集群 EC2 实例的服务角色。因此，我们建议附加到此角色的策略限制对 Amazon S3 的权限。有关更多信息，请参阅[集群 EC2 实例（EC2 实例配置文件）的服务角色](emr-iam-role-for-ec2.md)。

## 配置 角色
<a name="emr-emrfs-iam-roles-role-configuration"></a>

在为 EMRFS 的 IAM 角色设置安全配置之前，请计划并创建角色和要附加到角色的权限策略。有关更多信息，请参阅《IAM 用户指南》**中的 [EC2 实例的角色的工作方式](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)。创建权限策略时，建议先使用附加到 EC2 默认 Amazon EMR 角色的托管式策略，然后根据自己的要求编辑该策略。默认角色名为 `EMR_EC2_DefaultRole`，要编辑的默认托管式策略为 `AmazonElasticMapReduceforEC2Role`。有关更多信息，请参阅[集群 EC2 实例（EC2 实例配置文件）的服务角色](emr-iam-role-for-ec2.md)。

### 更新信任策略以代入角色权限
<a name="emr-emrfs-iam-role-trust-policy"></a>

EMRFS 使用的每个角色必须具有信任策略，以允许 EC2 的集群 Amazon EMR 角色代入该角色。与此类似，EC2 的集群 Amazon EMR 角色必须具有信任策略，以允许 EMR 角色代入该角色。

以下示例信任策略附加到 EMRFS 的角色。该语句允许 EC2 的默认 Amazon EMR 角色代入该角色。例如，如果您有两个虚构 EMRFS 角色 `EMRFSRole_First` 和 `EMRFSRole_Second`，此策略语句添加到这两个角色的信任策略。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowSTSAssumerole",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/EMR_EC2_DefaultRole"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

此外，以下示例信任策略语句添加到 `EMR_EC2_DefaultRole` 以允许两个虚构 EMRFS 角色代入该角色。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowSTSAssumerole",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123456789012:role/EMRFSRole_First",
          "arn:aws:iam::123456789012:role/EMRFSRole_Second"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

**更新 IAM 角色的信任策略**

使用 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 选择 **Roles (角色)**，在 **Search (搜索)** 中输入角色的名称，然后选择其 **Role name (角色名称)**。

1. 选择**信任关系**，然后选择**编辑信任关系**。

1. 根据 **Policy Document**（策略文档）和上述指南添加信任语句，然后选择 **Update Trust Policy**（更新信任策略）。

### 指定角色作为密钥用户
<a name="emr-emrfs-iam-role-key-user"></a>

如果某个角色允许访问 Amazon S3 中使用 Amazon KMS key进行加密的位置，请务必将该角色指定为密钥用户。这会为该角色授予使用该 KMS 密钥的权限。有关更多信息，请参阅*Amazon Key Management Service 开发人员指南*中的[在 Amazon KMS中使用密钥策略](https://docs.amazonaws.cn//kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。

## 为 EMRFS 的 IAM 角色设置安全配置
<a name="emr-emrfs-iam-roles-setup"></a>

**重要**  
如果您指定的 EMRFS 的所有 IAM 角色都不适用，EMRFS 将回退使用 EC2 的 Amazon EMR 角色。在创建集群时，可以考虑根据应用程序的需要自定义角色以限制对 Amazon S3 的权限，然后指定该自定义角色，而不是指定 `EMR_EC2_DefaultRole`。有关更多信息，请参阅[使用 Amazon EMR 自定义 IAM 角色](emr-iam-roles-custom.md)和[在创建集群时指定自定义 IAM 角色](emr-iam-roles-custom.md#emr-iam-roles-launch-jobflow)。

**使用控制台指定用于处理 EMRFS 对 Amazon S3 的请求的 IAM 角色**

1. 创建一个安全配置来指定角色映射：

   1. 在 Amazon EMR 控制台中，依次选择 **Security configurations (安全配置)** 和 **Create (创建)**。

   1. 键入安全配置的 **Name (名称)**。在创建集群时，使用此名称来指定安全配置。

   1. 选择 **Use IAM roles for EMRFS requests to Amazon S3**（使用 IAM 角色处理 EMRFS 对 Amazon S3 的请求）。

   1. 选择要应用的 **IAM 角色**，在**访问基础**下的列表中选择标识符类型（**用户**、**组**或 **S3 前缀**，然后输入相应标识符。如果使用多个标识符，请将它们以逗号分隔，不要包含空格。有关每个标识符类型的更多信息，请参阅以下 [JSON configuration reference](#emrfs-seccfg-json)。

   1. 选择**Add role (添加角色)**设置其它角色映射，如上一步所述。

   1. 根据需要设置其它安全配置选项，然后选择 **Create (创建)**。有关更多信息，请参阅[使用 Amazon EMR 控制台或使用 Amazon CLI](emr-create-security-configuration.md)。

1. 创建集群时，指定在上面创建的安全配置。有关更多信息，请参阅 [指定 Amazon EMR 集群的安全配置](emr-specify-security-configuration.md)。

**要为向 Amazon S3 发出的 EMRFS 请求指定 IAM 角色，请使用 Amazon CLI**

1. 使用 `aws emr create-security-configuration` 命令，并指定安全配置的名称以及 JSON 格式的安全配置详细信息。

   下面所示的示例命令创建名为 `EMRFS_Roles_Security_Configuration` 的安全配置。它基于保存在执行该命令的目录下的文件 `MyEmrfsSecConfig.json` 中的 JSON 结构。

   ```
   aws emr create-security-configuration --name {{EMRFS_Roles_Security_Configuration}} --security-configuration {{file://MyEmrFsSecConfig.json}}.
   ```

   按照以下准则处理 `MyEmrFsSecConfig.json` 文件的结构。您可以与其它安全配置选项的结构一起指定此结构。有关更多信息，请参阅[使用 Amazon EMR 控制台或使用 Amazon CLI](emr-create-security-configuration.md)。

   以下是一个示例 JSON 代码段，用于在安全配置中为 EMRFS 指定自定义 IAM 角色。它演示了三种不同标识符类型的角色映射，后跟参数引用。

   ```
   {
     "AuthorizationConfiguration": {
       "EmrFsConfiguration": {
         "RoleMappings": [{
           "Role": "{{arn:aws:iam::123456789101:role/allow_EMRFS_access_for_user1}}",
           "IdentifierType": "User",
           "Identifiers": [ "{{user1}}" ]
         },{
           "Role": "{{arn:aws:iam::123456789101:role/allow_EMRFS_access_to_demo_s3_buckets}}",
           "IdentifierType": "Prefix",
           "Identifiers": [ "{{s3://amzn-s3-demo-bucket1/","s3://amzn-s3-demo-bucket2/}}" ]
         },{
           "Role": "{{arn:aws:iam::123456789101:role/allow_EMRFS_access_for_AdminGroup}}",
           "IdentifierType": "Group",
           "Identifiers": [ "{{AdminGroup}}" ]
         }]
       }
     }
   }
   ```    
[See the AWS documentation website for more details](http://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html)

1. 使用 `aws emr create-cluster` 命令创建集群，并指定上一步中创建的安全配置。

   以下示例创建一个安装了默认核心 Hadoop 应用程序的集群。该集群使用上面创建的安全配置作为 `EMRFS_Roles_Security_Configuration`，还使用 EC2 的自定义 Amazon EMR 角色 `EC2_Role_EMR_Restrict_S3`，该角色由 `InstanceProfile` 参数的 `--ec2-attributes` 变量指定。
**注意**  
为了便于读取，包含 Linux 行继续符（\\）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

   ```
   aws emr create-cluster --name {{MyEmrFsS3RolesCluster}} \
   --release-label {{emr-7.13.0}} --ec2-attributes InstanceProfile={{EC2_Role_EMR_Restrict_S3}},KeyName={{MyKey}} \
   --instance-type {{m5.xlarge}} --instance-count {{3}} \
   --security-configuration {{EMRFS_Roles_Security_Configuration}}
   ```