为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

当在集群上运行的应用程序引用使用 s3://mydata 格式的数据时,Amazon EMR 使用 EMRFS 发出请求。为了与 Amazon S3 交互,EMRFS 会代入附加到您的 Amazon EC2 实例配置文件的权限策略。无论运行应用程序的用户或组或数据在 Amazon S3 中的位置如何,都会使用相同的 Amazon EC2 实例配置文件。

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

Amazon EMR 版本 5.10.0 和更高版本支持为 EMRFS 使用自定义 IAM 角色。如果您使用的是早期版本或有 EMRFS 的 IAM 角色无法满足的其它要求,可以创建自定义凭证提供程序。有关更多信息,请参阅授权访问 Amazon S3 中的 EMRFS 数据

当您使用安全配置为 EMRFS 指定 IAM 角色时,请设置角色映射。每个角色映射都指定与标识符对应的 IAM 角色。这些标识符确定通过 EMRFS 访问 Amazon S3 的基础。标识符可以是用户、组或指示数据位置的 Amazon S3 前缀。当 EMRFS 向 Amazon S3 发出请求时,如果请求与访问基础匹配,则 EMRFS 让集群 EC2 实例代入与该请求对应的 IAM 角色。对于集群 EC2 实例,应用的是附加在该角色上的 IAM 权限,而不是附加在服务角色上的 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 默认 Amazon EMR 角色的托管式策略,然后根据自己的要求编辑该策略。默认角色名为 EMR_EC2_DefaultRole,要编辑的默认托管式策略为 AmazonElasticMapReduceforEC2Role。有关更多信息,请参阅集群 EC2 实例(EC2 实例配置文件)的服务角色

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

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

以下示例信任策略附加到 EMRFS 的角色。该语句允许 EC2 的默认 Amazon 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.aws.amazon.com/iam/

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

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

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

指定角色作为密钥用户

如果某个角色允许访问 Amazon S3 中使用 Amazon KMS key 进行加密的位置,请务必将该角色指定为密钥用户。这会为该角色授予使用该 KMS 密钥的权限。有关更多信息,请参阅Amazon Key Management Service开发人员指南中的在 Amazon KMS 中使用密钥策略

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

重要

如果您指定的 EMRFS 的所有 IAM 角色都不适用,EMRFS 将回退使用 EC2 的 Amazon 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 configuration reference

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

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

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

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

    以下是一个示例 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_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 标识符。如果 EMRFS 对 Amazon S3 的请求与指定的任何 Identifiers 匹配,则这是 Amazon EMR 承担的 IAM 角色。

       "IdentifierType":

    可以是以下值之一:

    • "User" 指定标识符是一个或多个 Hadoop 用户,可以是 Linux 账户用户或 Kerberos 主体。如果 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 的自定义 Amazon EMR 角色 EC2_Role_EMR_Restrict_S3,该角色由 InstanceProfile 参数的 --ec2-attributes 变量指定。

    注意

    为了便于读取,包含 Linux 行继续符 (\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号(^)。

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