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

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

当在 Amazon EMR 集群上运行的应用程序使用 s3://mydata 格式引用数据时,Amazon EMR 使用 EMRFS 发出请求。为了与 Amazon S3 交互,EMRFS 会代入在创建集群时指定的附加到集群 EC2 实例的服务角色(EC2 实例配置文件)的权限策略。不管使用应用程序的用户或组或数据在 Amazon S3 中的位置为何,都使用相同的集群 EC2 实例的服务角色。如果您的集群中有多个用户需要通过 EMRFS 对 Amazon S3 中的数据进行不同级别的访问,则可以为 EMRFS 设置具有 IAM 角色的安全配置。EMRFS 可以根据发出请求的用户或组或根据 Amazon S3 中的数据位置来代入不同的集群 EC2 实例的服务角色。EMRFS 的每个 IAM 角色都可以对 Amazon S3 中的数据具有不同访问权限。

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

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

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

重要

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

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

配置角色

在为 EMRFS 的 IAM 角色设置安全配置之前,请计划并创建角色和要附加到角色的权限策略。有关更多信息,请参阅 IAM 用户指南中的 EC2 实例的角色如何工作?。创建权限策略时,建议先使用附加到 EC2 默认 EMR 角色的托管策略,然后根据自己的要求编辑该策略。默认角色为 EMR_EC2_DefaultRole,要编辑的默认托管策略为 AmazonElasticMapReduceforEC2Role。有关更多信息,请参阅 集群 EC2 实例的服务角色(EC2 实例配置文件)

更新信任策略以代入角色权限

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

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

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

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

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

更新 IAM 角色的信任策略

通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

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

  2. 选择信任关系,然后选择编辑信任关系

  3. 根据 Policy Document (策略文档) 和上述指南添加信任语句,然后选择 Update Trust Policy (更新信任策略)

指定角色作为密钥用户

如果某个角色允许访问 Amazon S3 中使用 AWS Key Management Service 客户主密钥 (CMK) 进行加密的位置,请确保该角色被指定为密钥用户。这会为该角色授予使用 CMK 的权限。有关更多信息,请参阅 AWS Key Management Service Developer Guide中的使用密钥策略

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

重要

如果您指定的 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 应用程序的集群。该集群使用上面创建的安全配置作为 EMRFS_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.27.0 --ec2-attributes InstanceProfile=EC2_Role_EMR_Restrict_S3,KeyName=MyKey \ --instance-type m5.xlarge --instance-count 3 \ --security-configuration EMRFS_Roles_Security_Configuration