Amazon EMR 步骤的运行时角色 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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) 上创建安全配置,并将其设置EnableApplicationScopedIAMRoletrue。有关安全配置的更多信息,请参阅 使用安全配置设置集群安全性

{ "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 作为集群应用程序。有关如何启动集群的说明,请参阅 为集群指定安全配置

使用亚马逊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 访问该集群。

使用亚马逊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

使用 SageMaker Studio 笔记本中的运行时角色连接到 Amazon EMR 集群

您可以将亚马逊EMR运行时角色应用于在 SageMaker Studio 的亚马逊EMR集群中运行的查询。为此,请执行以下步骤。

  1. 按照启动 Amazon SageMaker Studio 中的说明创建 SageMaker 工作室。

  2. 在 SageMaker Studio 用户界面中,使用支持的内核启动笔记本电脑。例如,用 PySpark 内核启动 SparkMagic 镜像。

  3. 在 SageMaker Studio 中选择一个亚马逊EMR集群,然后选择 Connect

  4. 选择运行时角色,然后选择 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上下文密钥创建条件 GetClusterSessionCredentialsAPIs,如下例所示。

{ "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 DescribeSecurityConfigurationAPI,如以下示例所示。

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.jarJAR文件运行命令时,必须逃避 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