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

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

如果集群中有多个需要通过 EMRFS 对 Amazon S3 中的数据进行不同级别访问的用户,您可以基于发出请求的用户或组,或基于数据在 IAM 中的位置来设置安全配置,让 EMRFS 代入不同的 Amazon S3 角色。每个 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 使集群 EMR 实例为请求代入相应的 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 角色设置安全配置之前,请计划并创建角色和要附加到角色的权限策略。有关更多信息,请参阅 IAM 用户指南中的 EC2 实例的角色如何工作?。创建权限策略时,建议先使用附加到 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 控制台中,依次选择 Security configurations (安全配置)Create (创建)

    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 配置参考

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

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

  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,该角色由 InstanceProfile 参数的 --ec2-attributes 变量指定。

    注意

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

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