本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon EMR 步骤的运行时角色
运行时角色是一个 AWS Identity and Access Management (IAM) 角色,您可以在向 Amazon EMR 集群提交任务或查询时指定该角色。您提交到 Amazon EMR 集群的任务或查询使用运行时角色访问 AWS 资源,例如 Amazon S3 中的对象。您可以使用 Amazon EMR 为 Spark 和 Hive 作业指定运行时角色。
当您在 Amazon SageMaker AI 内连接到 Amazon EMR 集群时,以及在将 Amazon EMR Studio Workspace 连接到 EMR 集群时,您也可以指定运行时系统角色。有关更多信息,请参阅从 A SageMaker I Studio 连接到 Amazon EMR 集群和。使用运行时角色运行 EMR Studio 工作区
以前,Amazon EMR 集群运行 Amazon EMR 作业或查询,其权限基于附加到您用于启动集群的实例配置文件的 IAM policy。这意味着策略必须包含在 Amazon EMR 集群上所运行所有作业和查询的所有权限的联合。使用运行时角色,您现在可以单独管理每个作业或查询的访问控制,而不是共享集群的 Amazon EMR 实例配置文件。
在具有运行时角色的 Amazon EMR 集群上,您还可以对 Spark、Hive 和 Presto 任务以及对数据湖的查询应用 AWS Lake Formation 基于访问权限的控制。要了解有关如何与集成的更多信息 AWS Lake Formation,请参阅将 Amazon 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 } } }
建议您始终在安全配置中启用传输中加密选项,以便对通过互联网传输的数据进行加密,而不是以纯文本形式传输。如果您不想使用来自 SageMaker Runtime Studio 或 EMR Studio 的运行时角色连接到亚马逊 EMR 集群,则可以跳过这些选项。要配置数据加密,请参阅配置数据加密。
或者,您可以使用 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 集群
设置配置后,您可以使用 步骤 1:在 Amazon EMR 中设置安全配置 安全配置来启动 Amazon EMR 集群。要在 Amazon EMR 步骤中使用运行时角色,请使用版本标签emr-6.7.0
或更高版本,然后选择 Hive、Spark 或两者作为集群应用程序。 CloudWatchAgent 在 EMR 7.6 及更高版本的运行时角色集群上受支持。要从 SageMaker AI Studio 进行连接,请使用版本emr-6.9.0
或更高版本,然后选择 Livy、Spark、Hive 或 Presto 作为集群应用程序。有关如何启动集群的说明,请参阅 指定 Amazon EMR 集群的安全配置。
使用 Amazon EMR 步骤提交 Spark 任务
以下是如何运行 Apache Spark 中包含的 HdfsTest 示例的示例。只有在提供的 Amazon EMR 运行时角色有权访问 S3_LOCATION
时,API 调用才会成功。
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
注意
我们建议您关闭对 Amazon EMR 集群的 SSH 访问权限,并且只允许 Amazon EMR AddJobFlowSteps
API 访问集群。
使用 Amazon EMR 步骤提交 Hive 任务
以下示例使用带有 Amazon EMR 步骤的 Apache Hive 提交任务以运行 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
使用 AI Studio 笔记本中的运行时角色连接到 SageMaker Amazon EMR 集群
您可以将 Amazon EMR 运行时角色应用于在 AI Studio 的亚马逊 EMR 集群中运行的查询。 SageMaker 为此,请执行以下步骤。
-
按照启动 Amazon A SageMaker I Studio 中的说明创建 SageMaker AI Studio。
-
在 SageMaker AI Studio 用户界面中,使用支持的内核启动笔记本电脑。例如,用 PySpark 内核启动 SparkMagic 镜像。
-
在 A SageMaker I Studio 中选择一个 Amazon EMR 集群,然后选择 Connect。
-
选择运行时角色,然后选择 Connect(连接)。
这将创建一个带有神奇命令的 SageMaker AI 笔记本单元,用于使用所选的 Amazon EMR 运行时角色连接到您的 Amazon EMR 集群。在 Notebook 单元中,您可以使用运行时角色和基于 Lake Formation 的访问控制输入和运行查询。有关更详细的示例,请参阅使用精细的数据访问控制和 Amazon AI Studio 的 AWS Lake Formation Amaz SageMaker on EMR
控制对 Amazon EMR 运行时角色的访问
您可以使用条件键 elasticmapreduce:ExecutionRoleArn
控制对运行时角色的访问。以下策略允许 IAM 主体使用名为 Caller
的 IAM 角色,或任何以字符串 CallerTeamRole
开头的 IAM 角色,作为运行时角色。
重要
在向呼叫者授予调用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 EMR DescribeSecurityConfiguration
API 查找外部 ID,如以下示例所示。
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
,当你从 AI Studio 连接到亚马逊 EMR 集群时,你可能会遇到间歇性故障。 SageMaker 要解决此问题,您可以在启动集群时通过引导操作来安装补丁。有关补丁的详细信息,请参阅 Amazon EMR release 6.9.0 known issues(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
或更高版本时,AI Studio 支持带有运行时角色的 Spark、Hive 和 Presto 查询。 -
SageMaker AI 中的以下笔记本内核支持运行时角色:
-
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 不支持您配置为高可用性的集群上的运行时角色。
从亚马逊 EMR 7.5.0 及更高版本开始,运行时角色支持查看 Spark 和 YARN 用户界面 (UIs),例如:Spark Live 用户界面、Spark History Server NodeManager、YARN 和 YARN。 ResourceManager当您导航到它们时 UIs,会出现用户名和密码提示。用户名和密码可以通过使用 GetClusterSessionCredentials EMR API 生成。有关 API 用法详情的更多信息,请参阅GetClusterSessionCredentials。
以下是如何使用 EMR GetClusterSessionCredentials API 的示例:
aws emr get-cluster-session-credentials --cluster-id
<cluster_ID>
--execution-role-arn<IAM_role_arn>
-
使用
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>
此外,使用脚本运行器运行命令时,必须逃避 Bash 命令参数。以下是显示设置 Spark 属性的示例,其中包含转义字符:
"\"--conf spark.sql.autoBroadcastJoinThreshold=-1\n--conf spark.cradle.RSv2Mode.enabled=true\""
-
运行时角色不支持控制对集群上资源(例如 HDFS 和 HMS)的访问。