本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon EMR 步骤的运行时角色
运行时角色是一个 AWS Identity and Access Management (IAM) 角色,您可以在向 Amazon EMR 集群提交任务或查询时指定该角色。您提交到 Amazon EMR 集群的任务或查询使用运行时角色访问 AWS 资源,例如 Amazon S3 中的对象。您可以通过 Amazon EMR 为 Spark 和 Hive 任务指定运行时角色。
当您在集群中连接亚马逊EMR集群 Amazon SageMaker 以及将 Amazon EMR Studio 工作区连接到EMR集群时,您也可以指定运行时角色。有关更多信息,请参阅从 Studio 连接到亚马逊EMR集群和使用运行时角色运行 EMR Studio 工作区。
以前,Amazon EMR 集群根据您用来启动集群的实例配置文件所附IAM策略的权限运行 Amazon EMR 任务或查询。这意味着策略必须包含在 Amazon EMR 集群上运行的所有任务和查询的所有权限的并集。借助运行时角色,您现在可以单独管理每个任务的访问控制或查询,而不必共享集群的 Amazon EMR 实例配置文件。
在具有运行时角色的 Amazon EMR 集群上,您还可以对 Spark、Hive 和 Presto 任务以及针对数据湖的查询应用 AWS Lake Formation 基于访问权限的控制。要了解有关如何与集成的更多信息 AWS Lake Formation,请参阅将亚马逊EMR与 AWS Lake Formation。
注意
当您为 Amazon EMR 步骤指定运行时角色时,您提交的任务或查询只能访问附加到该运行时角色的策略允许的 AWS 资源。这些任务和查询无法访问集群实例上的实例元数据服务,也无法使用集群的EC2实例配置文件访问任何 AWS 资源。EC2
使用运行时角色启动 Amazon EMR 集群的先决条件
步骤 1:在 Amazon 中设置安全配置 EMR
使用以下JSON结构在 AWS Command Line Interface (AWS CLI) 上创建安全配置,并将其设置EnableApplicationScopedIAMRole
为true
。有关安全配置的更多信息,请参阅 使用安全配置来设置 Amazon EMR 集群安全。
{ "AuthorizationConfiguration":{ "IAMConfiguration":{ "EnableApplicationScopedIAMRole":true } } }
建议您始终在安全配置中启用传输中加密选项,以便对通过互联网传输的数据进行加密,而不是以纯文本形式传输。如果您不想通过 Runtime Studio 或 EMR Studio 的运行时角色连接到亚马逊EMR集群,则可以跳过这些选项。 SageMaker 要配置数据加密,请参阅配置数据加密。
或者,您可以使用 AWS Management Console
步骤 2:为 Amazon EMR 集群设置EC2实例配置文件
Amazon EMR 集群使用 Amazon EC2 实例配置文件角色来代入运行时角色。要在 Amazon EMR 步骤中使用运行时角色,请将以下策略添加到您计划用作实例配置文件角色的角色中。IAM要向IAM角色添加策略或编辑现有的内联或托管策略,请参阅添加和删除IAM身份权限。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowRuntimeRoleUsage", "Effect":"Allow", "Action":[ "sts:AssumeRole", "sts:TagSession" ], "Resource":[
<runtime-role-ARN>
] } ] }
步骤 3:设置信任策略
对于您计划用作运行时IAM角色的每个角色,请设置以下信任策略,EMR_EC2_DefaultRole
替换为您的实例配置文件角色。要修改IAM角色的信任策略,请参阅修改角色信任策略。
{ "Sid":"AllowAssumeRole", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::
<AWS_ACCOUNT_ID>
:role/EMR_EC2_DefaultRole" }, "Action":"sts:AssumeRole" }
启动具有基于角色的访问控制的 Amazon EMR 集群
设置配置后,您可以使用中的安全配置启动 Amazon EMR 集群步骤 1:在 Amazon 中设置安全配置 EMR。要在 Amazon EMR 步骤中使用运行时角色,请使用发布标签emr-6.7.0
或更高版本,然后选择 Hive、Spark 或两者作为集群应用程序。要从 SageMaker Studio 进行连接,请使用版本emr-6.9.0
或更高版本,然后选择 Livy、Spark、Hive 或 Presto 作为集群应用程序。有关如何启动集群的说明,请参阅 为 Amazon EMR 集群指定安全配置。
使用亚马逊EMR步骤提交 Spark 任务
以下是如何运行 Apache Spark 中包含的 HdfsTest 示例的示例。仅当提供的 Amazon EMR 运行时角色可以访问时,此API调用才会S3_LOCATION
成功。
RUNTIME_ROLE_ARN=
<runtime-role-arn>
S3_LOCATION=<s3-path>
REGION=<aws-region>
CLUSTER_ID=<cluster-id>
aws emr add-steps --cluster-id $CLUSTER_ID \ --steps '[{ "Name": "Spark Example", "ActionOnFailure": "CONTINUE","HadoopJarStep": { "Jar":"command-runner.jar","Args" : ["spark-example","HdfsTest", "$S3_LOCATION"] } }]' \ --execution-role-arn $RUNTIME_ROLE_ARN \ --region $REGION
注意
我们建议您关闭SSH对 Amazon EMR 集群的访问权限,只允许 Amazon EMR AddJobFlowSteps
API 访问该集群。
使用 Amazon EMR 步骤提交 Hive 任务
以下示例使用 Apache Hive 和 Amazon EMR 步骤来提交运行该QUERY_FILE.hql
文件的任务。仅当提供的运行时角色可以访问查询文件的 Amazon S3 路径时,此查询才会成功。
RUNTIME_ROLE_ARN=
<runtime-role-arn>
REGION=<aws-region>
CLUSTER_ID=<cluster-id>
aws emr add-steps --cluster-id $CLUSTER_ID \ --steps '[{ "Name": "Run hive query using command-runner.jar - simple select","ActionOnFailure":"CONTINUE","HadoopJarStep": { "Jar": "command-runner.jar","Args" :["hive - f","s3://DOC_EXAMPLE_BUCKET
/QUERY_FILE.hql"] } }]' \ --execution-role-arn $RUNTIME_ROLE_ARN \ --region $REGION
使用 SageMaker Studio 笔记本中的运行时角色连接到 Amazon EMR 集群
您可以将亚马逊EMR运行时角色应用于在 SageMaker Studio 的亚马逊EMR集群中运行的查询。为此,请执行以下步骤。
-
按照启动 Amazon SageMaker Studio 中的说明创建 SageMaker Studio。
-
在 SageMaker Studio 用户界面中,使用支持的内核启动笔记本电脑。例如,用 PySpark 内核启动 SparkMagic 镜像。
-
在 SageMaker Studio 中选择一个亚马逊EMR集群,然后选择 Connect。
-
选择运行时角色,然后选择 Connect(连接)。
这将创建一个带有神奇命令的 SageMaker 笔记本单元,用于使用所选的 Amazon EMR 运行时角色连接到您的 Amazon EMR 集群。在笔记本单元中,您可以使用运行时角色和基于 Lake Formation 的访问控制输入和运行查询。有关更详细的示例,请参阅使用 Amazon Studio 和 AWS Lake Formation A EMR ma SageMaker zon 应用精细的数据访问控制
控制对 Amazon EMR 运行时角色的访问权限
您可以使用条件键 elasticmapreduce:ExecutionRoleArn
控制对运行时角色的访问。以下策略允许IAM委托人使用名为Caller
的IAM角色或任何IAM以字符串CallerTeamRole
开头的角色作为运行时角色。
重要
在向呼叫者授予调用AddJobFlowSteps
或的访问权限时,必须根据elasticmapreduce:ExecutionRoleArn
上下文密钥创建条件 GetClusterSessionCredentials
APIs,如下例所示。
{ "Sid":"AddStepsWithSpecificExecRoleArn", "Effect":"Allow", "Action":[ "elasticmapreduce:AddJobFlowSteps" ], "Resource":"*", "Condition":{ "StringEquals":{ "elasticmapreduce:ExecutionRoleArn":[ "arn:aws:iam::
<AWS_ACCOUNT_ID>
:role/Caller" ] }, "StringLike":{ "elasticmapreduce:ExecutionRoleArn":[ "arn:aws:iam::<AWS_ACCOUNT_ID>
:role/CallerTeamRole*" ] } } }
在运行时角色和 Amazon EMR 集群之间建立信任
通过激活运行时角色授权,Amazon EMR 会ExternalId
为每个安全配置生成一个唯一标识符。该授权使每个用户都拥有一组运行时角色,可以在属于自己的集群上使用。例如,在企业中,每个部门都可以使用其外部 ID 更新自己的一组运行时角色的信任策略。
您可以通过 Amazon 找到外部 ID EMR DescribeSecurityConfiguration
API,如以下示例所示。
aws emr describe-security-configuration --name 'iamconfig-with-lf'{"Name": "iamconfig-with-lf", "SecurityConfiguration": "{\"AuthorizationConfiguration\":{\"IAMConfiguration\":{\"EnableApplicationScopedIAMRole\ ":true,\"ApplicationScopedIAMRoleConfiguration\":{\"PropagateSourceIdentity\":true,\"Exter nalId\":\"FXH5TSACFDWUCDSR3YQE2O7ETPUSM4OBCGLYWODSCUZDNZ4Y\"}},\"Lake FormationConfiguration\":{\"AuthorizedSessionTagValue\":\"Amazon EMR\"}}}", "CreationDateTime": "2022-06-03T12:52:35.308000-07:00" }
有关如何使用外部 ID 的信息,请参阅在向第三方授予对 AWS 资源的访问权限时如何使用外部 ID。
审核
要监控和控制最终用户对IAM角色执行的操作,您可以开启源身份功能。了解有关源身份的更多信息,请参阅监控和控制使用所担任角色执行的操作。
要跟踪源身份,请在安全配置中将 ApplicationScopedIAMRoleConfiguration/PropagateSourceIdentity
设置为 true
,如下所示。
{ "AuthorizationConfiguration":{ "IAMConfiguration":{ "EnableApplicationScopedIAMRole":true, "ApplicationScopedIAMRoleConfiguration":{ "PropagateSourceIdentity":true } } } }
当您设置PropagateSourceIdentity
为时true
,Amazon 会将调用凭证中的源身份EMR应用于您使用运行时角色创建的任务或查询会话。如果调用凭证中没有源身份,Amazon 就EMR不会设置源身份。
要使用此属性,请为您的实例配置文件提供 sts:SetSourceIdentity
权限,如下所示。
{ // PropagateSourceIdentity statement "Sid":"PropagateSourceIdentity", "Effect":"Allow", "Action":"sts:SetSourceIdentity", "Resource":[
<runtime-role-ARN>
], "Condition":{ "StringEquals":{ "sts:SourceIdentity":<source-identity>
} } }
您还必须将 AllowSetSourceIdentity
语句添加到运行时角色的信任策略中。
{ // AllowSetSourceIdentity statement "Sid":"AllowSetSourceIdentity", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::
<AWS_ACCOUNT_ID>
:role/EMR_EC2_DefaultRole" }, "Action":[ "sts:SetSourceIdentity", "sts:AssumeRole" ], "Condition":{ "StringEquals":{ "sts:SourceIdentity":<source-identity>
} } }
额外注意事项
注意
随着亚马逊的EMR发布emr-6.9.0
,当你从 SageMaker Studio 连接到亚马逊EMR集群时,你可能会遇到间歇性故障。要解决此问题,您可以在启动集群时通过引导操作来安装补丁。有关补丁的详细信息,请参阅 Amazon EMR 版本 6.9.0 已知问题。
此外,在为 Amazon 配置运行时角色时,请考虑以下几点EMR。
-
Amazon EMR 支持所有商业广告中的运行时角色 AWS 区域。
-
当你使用版本或更高版本
emr-6.7.0
时,Amazon EMR 步骤支持带有运行时角色的 Apache Spark 和 Apache Hive 作业。 -
SageMaker 当你使用发行版
emr-6.9.0
或更高版本时,Studio 支持带有运行时角色的 Spark、Hive 和 Presto 查询。 -
以下笔记本内核 SageMaker 支持运行时角色:
-
DataScience — Python 3 内核
-
DataScience 2.0 — Python 3 内核
-
DataScience 3.0 — Python 3 内核
-
SparkAnalytics 1.0 — SparkMagic 还有内 PySpark 核
-
SparkAnalytics 2.0 — SparkMagic 还有内 PySpark 核
-
SparkMagic — PySpark 内核
-
-
Amazon EMR 支持
RunJobFlow
仅在创建集群时使用的步骤。这API不支持运行时角色。 -
对于您配置为高可用性的集群,Amazon EMR 不支持运行时角色。
-
使用
command-runner.jar
JAR文件运行命令时,必须逃避 Bash 命令参数:aws emr add-steps --cluster-id
<cluster-id>
--steps '[{"Name":"sample-step","ActionOnFailure":"CONTINUE","Jar":"command-runner.jar","Properties":"","Args":["bash","-c","\"aws s3 ls\""],"Type":"CUSTOM_JAR"}]' --execution-role-arn<IAM_ROLE_ARN>
-
运行时角色不支持控制对群集上资源(例如HDFS和HMS)的访问权限。