Amazon EMR 步骤的运行时角色 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon EMR 步骤的运行时角色

运行时角色是一个 Amazon Identity and Access Management(IAM)角色,您可以在向 Amazon EMR 集群提交作业或查询时指定该角色。您提交给 Amazon EMR 集群的作业或查询使用运行时角色访问 Amazon 资源,例如 Amazon S3 中的对象。您可以使用 Amazon EMR 为 Spark 和 Hive 作业指定运行时角色。

当您在 Amazon SageMaker 内连接到 Amazon EMR 集群时,以及在将 Amazon EMR Studio 工作区连接到 EMR 集群时,您也可以指定运行时系统角色。有关更多信息,请参阅 Connect to an Amazon EMR cluster from Studio使用运行时系统角色运行 EMR Studio Workspace

以前,Amazon EMR 集群运行 Amazon EMR 作业或查询,其权限基于附加到您用于启动集群的实例配置文件的 IAM policy。这意味着策略必须包含在 Amazon EMR 集群上所运行所有作业和查询的所有权限的联合。使用运行时角色,您现在可以单独管理每个作业或查询的访问控制,而不是共享集群的 Amazon EMR 实例配置文件。

在具有运行时角色的 Amazon EMR 集群上,您还可以将基于 Amazon Lake Formation 的访问控制应用于针对数据湖的 Spark、Hive 和 Presto 作业和查询。要了解有关如何与 Amazon Lake Formation 集成的更多信息,请参阅 将 Amazon EMR 与 Amazon Lake Formation 集成

注意

当您为 Amazon EMR 步骤指定运行时角色时,您提交的作业或查询只能访问附加到运行时角色的策略所允许的 Amazon 资源。这些作业和查询无法访问该集群 EC2 实例上的 Instance Metadata Service,也无法使用集群的 EC2 实例配置文件来访问任何 Amazon 资源。

使用运行时角色启动 Amazon EMR 集群的先决条件

步骤 1:在 Amazon EMR 中设置安全配置

使用以下 JSON 结构在 Amazon Command Line Interface (Amazon CLI) 上创建安全配置,并将 EnableApplicationScopedIAMRole 设置为 true。有关安全配置的更多信息,请参阅 使用安全配置设置 Amazon EMR 集群安全性

{ "AuthorizationConfiguration":{ "IAMConfiguration":{ "EnableApplicationScopedIAMRole":true } } }

建议您始终在安全配置中启用传输中加密选项,以便对通过互联网传输的数据进行加密,而不是以纯文本形式传输。如果您不想从 SageMaker Studio 或 EMR Studio 使用运行时系统角色连接到 Amazon EMR 集群,则可以跳过这些选项。要配置数据加密,请参阅配置数据加密

或者,您可以使用 Amazon Web Services 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 作为集群应用程序。要从 SageMaker 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

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

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

  1. 按照 Launch Amazon SageMaker Studio(启动 Amazon SageMaker Studio)中的说明创建 SageMaker Studio。

  2. 在 SageMaker Studio UI 中,启动具有支持的内核的笔记本。例如,启动具有 PySpark 内核的 SparkMagic 映像。

  3. 在 SageMaker Studio 中选择 Amazon EMR 集群,然后选择 Connect(连接)。

  4. 选择运行时角色,然后选择 Connect(连接)。

这将使用魔术命令创建一个 SageMaker 笔记本单元,以使用所选的 Amazon EMR 运行时角色连接到您的 Amazon EMR 集群。在笔记本单元中,您可以使用运行时角色和基于 Lake Formation 的访问控制输入和运行查询。有关更多详细示例,请参阅使用 Amazon SageMaker Studio 中的 Amazon Lake Formation 和 Amazon EMR 应用精细数据访问控制

控制对 Amazon EMR 运行时角色的访问

您可以使用条件键 elasticmapreduce:ExecutionRoleArn 控制对运行时角色的访问。以下策略允许 IAM 主体使用名为 Caller 的 IAM 角色,或任何以字符串 CallerTeamRole 开头的 IAM 角色,作为运行时角色。

重要

向调用者授予调用 AddJobFlowStepsGetClusterSessionCredentials API 的访问权限时,您必须创建基于 elasticmapreduce:ExecutionRoleArn 上下文键的条件,如以下示例所示。

{ "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 的信息,请参阅如何在向第三方授予对 Amazon 资源的访问权时使用外部 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> } } }

额外注意事项

注意

使用 Amazon EMR 发行版本 emr-6.9.0,当您从 SageMaker Studio 连接到 Amazon EMR 集群时,可能会遇到间歇性故障。要解决此问题,您可以在启动集群时通过引导操作来安装补丁。有关补丁的详细信息,请参阅 Amazon EMR release 6.9.0 known issues(Amazon EMR 发行版本 6.9.0 已知问题)。

此外,在为 Amazon EMR 配置运行时角色时,请考虑以下事项。

  • Amazon EMR 支持所有商业 Amazon Web Services 区域 中的运行时角色。

  • 当您使用发行版本 emr-6.7.0 或更高版本时,Amazon EMR 步骤支持具有运行时角色的 Apache Spark 和 Apache Hive 作业。

  • 当您使用发行版本 emr-6.9.0 或更高版本时,SageMaker 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)的访问。