Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色

如果集群中有多个需要通过 EMRFS 对 Amazon S3 中的数据进行不同级别访问的用户,您可以基于发出请求的用户或组,或基于数据在 Amazon S3 中的位置来设置安全配置,让 EMRFS 代入不同的 IAM 角色。每个 IAM 角色都可以对 Amazon S3 中的数据具有不同访问权限。

此功能在 Amazon EMR 版本 5.10.0 及更高版本中提供。如果您使用的是早期版本或有 EMRFS 的 IAM 角色无法满足的其他要求,可以创建自定义凭证提供程序。有关更多信息,请参阅 授予对 Amazon S3 中的 EMRFS 数据的访问权。有关 EMRFS 的更多信息,请参阅使用 EMR 文件系统 (EMRFS)

EMRFS 的 IAM 角色的工作原理

默认情况下,当集群应用程序通过 EMRFS 向 Amazon S3 发出请求时,EMRFS 使用集群所用的 EC2 的 EMR 角色所附加的权限策略,而不管是哪些用户或组在使用该应用程序,也不管数据在 Amazon S3 中的位置如何。

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

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

当集群应用程序通过 EMRFS 向 Amazon S3 发出请求时,EMRFS 按角色映射在安全配置中出现的先后顺序评估角色映射。如果通过 EMRFS 发出的请求与任何标识符都不匹配,EMRFS 将回退使用 EC2 的 EMR 角色。因此,我们建议附加到此角色的策略限制对 Amazon S3 的权限。

为 EMRFS 的 IAM 角色设置安全配置

在为 EMRFS 的 IAM 角色设置安全配置之前,请计划并创建角色和要附加到角色的权限策略。有关更多信息,请参阅 EC2 实例的角色如何工作? (在 IAM User Guide 中)。创建权限策略时,建议先使用附加到 EC2 默认 EMR 角色的托管策略 AmazonElasticMapReduceforEC2Role,然后根据自己的要求编辑该策略。有关更多信息,请参阅 使用默认 IAM 角色和托管策略。如果某个角色允许访问 Amazon S3 中使用 AWS Key Management Service 客户主密钥 (CMK) 进行加密的位置,请确保该角色被指定为密钥用户。这会为该角色授予使用 CMK 的权限。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的使用密钥策略

重要

如果您指定的 EMRFS 的所有 IAM 角色都不适用,EMRFS 将回退使用 EC2 的 EMR 角色。在创建集群时,可以考虑根据应用程序的需要自定义角色以限制对 Amazon S3 的权限,然后指定该自定义角色,而不是指定 EMR_EC2_DefaultRole。有关更多信息,请参阅 自定义 IAM 角色在创建集群时指定自定义 IAM 角色

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

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

    1. 在 Amazon EMR 控制台中,依次选择安全配置创建

    2. 键入安全配置的 Name。在创建集群时,使用此名称来指定安全配置。

    3. 选择 Use IAM roles for EMRFS requests to Amazon S3 (使用 IAM 角色处理 EMRFS 对 Amazon S3 的请求)。

    4. 选择要应用的 IAM role (IAM 角色),在 Basis for access (访问基础) 下的列表中选择标识符类型 (Users (用户)、Groups (组) 或 S3 prefixes (S3 前缀)),然后输入相应标识符。如果使用多个标识符,请将它们以逗号分隔,不要包含空格。有关每个标识符类型的更多信息,请参阅以下 JSON configuration reference

    5. 选择添加角色设置其他角色映射,如上一步所述。

    6. 根据需要设置其他安全配置选项,然后选择创建。有关更多信息,请参阅 创建安全配置

  2. 创建集群时,指定在上面创建的安全配置。有关更多信息,请参阅 为集群指定安全配置

使用 AWS CLI 指定用于处理 EMRFS 对 Amazon S3 的请求的 IAM 角色

  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 文件的结构,使用以下准则。您可以与其他安全配置选项的结构一起指定此结构。有关更多信息,请参阅 创建安全配置

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

    { "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_MyBuckets", "IdentifierType": "Prefix", "Identifiers": [ "s3://MyBucket/","s3://MyOtherBucket/" ] },{ "Role": "arn:aws:iam::123456789101:role/allow_EMRFS_access_for_AdminGroup", "IdentifierType": "Group", "Identifiers": [ "AdminGroup" ] }] } } }
    参数 说明

    "AuthorizationConfiguration":

    必需。

    "EmrFsConfiguration":

    必需。包含角色映射。

      "RoleMappings":

    必需。包含一个或多个角色映射定义。角色映射按它们出现的自上而下顺序进行计算。如果针对 Amazon S3 中的数据发出 EMRFS 调用时,某个角色映射的评估结果为 true,则不会评估其他角色映射,并且 EMRFS 将对该请求使用指定的 IAM 角色。角色映射包括以下必需参数:

       "Role":

    arn:aws:iam::account-id:role/role-name 格式指定 IAM 角色的 ARN 标识符。这是在对 Amazon S3 的 EMRFS 请求与任何指定的 Identifiers 匹配时 Amazon EMR 会采用的 IAM 角色。

       "IdentifierType":

    可以是以下值之一:

    • "User" 指定标识符是一个或多个可以是 Linux 账户用户或 Kerberos 委托人的 Hadoop 用户。当 EMRFS 请求源自指定的一个或多个用户时,将会采用 IAM 角色。

    • "Prefix" 指定标识符是 Amazon S3 位置。对于对具有指定前缀的一个或多个位置的调用,将会采用 IAM 角色。例如,前缀 s3://mybucket/ s3://mybucket/mydir s3://mybucket/yetanotherdir 匹配。

    • "Group" 指定标识符是一个或多个 Hadoop 组。如果请求源自一个或多个指定组中的用户,将会采用 IAM 角色。

       "Identifiers":

    指定相应标识符类型的一个或多个标识符。用逗号分隔多个标识符,不带空格。

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

    以下示例创建一个安装了默认核心 Hadoop 应用程序的集群。该集群使用上面创建的安全配置作为 ERMFS_Roles_Security_Configuration,还使用 EC2 的自定义 EMR 角色 EC2_Role_EMR_Restrict_S3,该角色由 --ec2-attributes 参数的 InstanceProfile 变量指定。

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws emr create-cluster --name MyEmrFsS3RolesCluster \ --release-label emr-5.14.0 --ec2-attributes InstanceProfile=EC2_Role_EMR_Restrict_S3,KeyName=MyKey \ --instance-type m4.large --instance-count 3