为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色
当在 Amazon EMR 集群上运行的应用程序使用 s3://
格式引用数据时,Amazon EMR 使用 EMRFS 发出请求。为了与 Amazon S3 交互,EMRFS 会代入在创建集群时指定的附加到集群 EC2 实例的服务角色(EC2 实例配置文件)的权限策略。不管使用应用程序的用户或组或数据在 Amazon S3 中的位置为何,都使用相同的集群 EC2 实例的服务角色。如果您的集群中有多个用户需要通过 EMRFS
对 Amazon S3 中的数据进行不同级别的访问,则可以为 EMRFS 设置具有 IAM 角色的安全配置。EMRFS 可以根据发出请求的用户或组或根据 Amazon
S3 中的数据位置来代入不同的集群 EC2 实例的服务角色。EMRFS 的每个 IAM 角色都可以对 Amazon S3 中的数据具有不同访问权限。
mydata
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://mybucket
或 s3://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_First
和 EMRFSRole_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/。
-
选择 Roles (角色),在 Search (搜索) 中输入角色的名称,然后选择其 Role name (角色名称)。
-
选择信任关系,然后选择编辑信任关系。
-
根据 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 角色
-
创建一个安全配置来指定角色映射:
-
在 Amazon EMR 控制台中,依次选择 Security configurations (安全配置)、Create (创建)。
-
键入安全配置的 Name (名称)。在创建集群时,使用此名称来指定安全配置。
-
选择 Use IAM roles for EMRFS requests to Amazon S3 (使用 IAM 角色处理 EMRFS 对 Amazon S3 的请求)。
-
选择要应用的 IAM role (IAM 角色),在 Basis for access (访问基础) 下的列表中选择标识符类型(Users (用户)、Groups (组) 或 S3 prefixes (S3 前缀)),然后输入相应标识符。如果使用多个标识符,请将它们以逗号分隔,不要包含空格。有关每个标识符类型的更多信息,请参阅以下 JSON 配置参考。
-
选择Add role (添加角色)设置其他角色映射,如上一步所述。
-
根据需要设置其他安全配置选项,然后选择Create (创建)。有关更多信息,请参阅创建安全配置。
-
-
创建集群时,指定在上面创建的安全配置。有关更多信息,请参阅为集群指定安全配置。
使用 AWS CLI 指定用于处理 EMRFS 对 Amazon S3 的请求的 IAM 角色
-
使用
aws emr create-security-configuration
命令,并指定安全配置的名称以及 JSON 格式的安全配置详细信息。下面所示的示例命令创建名为
EMRFS_Roles_Security_Configuration
的安全配置。它基于保存在执行该命令的目录下的文件MyEmrfsSecConfig.json
中的 JSON 结构。aws emr create-security-configuration --name
EMRFS_Roles_Security_Configuration
--security-configurationfile://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::
格式指定 IAM 角色的 ARN 标识符。这是在对 Amazon S3 的 EMRFS 请求与任何指定的account-id
:role/role-name
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":
指定相应标识符类型的一个或多个标识符。用逗号分隔多个标识符,不带空格。
-
-
使用
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-labelemr-5.27.0
--ec2-attributes InstanceProfile=EC2_Role_EMR_Restrict_S3
,KeyName=MyKey
\ --instance-typem5.xlarge
--instance-count3
\ --security-configurationEMRFS_Roles_Security_Configuration