使用运行时系统 IAM 角色从 Studio 连接到 Amazon EMR 集群 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用运行时系统 IAM 角色从 Studio 连接到 Amazon EMR 集群

当您从 Amazon SageMaker Studio 笔记本连接到 Amazon EMR 集群时,您可以直观地浏览 IAM 角色(称为运行时系统角色)列表,并即时选择一个角色。随后,从 Studio 笔记本创建的所有 Apache Spark、Apache Hive 或 Presto 作业只能访问运行时系统角色所附策略允许的数据和资源。此外,当从使用 Amazon Lake Formation 管理的数据湖访问数据时,可以使用附加到运行时系统角色的策略来执行表级和列级访问。

有了这项功能,您和您的队友就可以连接到同一个集群,每个人都可以使用一个运行时系统角色,该角色的权限与您访问数据的个人级别相匹配。您的会话在共享集群上也是相互隔离的。有了这种控制对同一共享集群上数据的细粒度访问的能力,您就可以简化 Amazon EMR 集群的预置,从而降低运营开销并节省成本。

要试用此新功能,请参阅从 Amazon SageMaker Studio 使用 Amazon Lake Formation 和 Amazon EMR 应用细粒度数据访问控制。本博文将有助于您建立一个演示环境,在该环境中,您可以尝试使用预配置的运行时系统角色来连接 Amazon EMR 集群。

先决条件

在开始之前,请确保您满足以下先决条件:

跨账户连接方案

当数据位于 Studio 账户之外时,运行时系统角色身份验证支持各种跨账户连接方案。下图显示了在 Studio 和数据账户之间分配 Amazon EMR 集群、数据甚至 Amazon EMR 执行角色的三种不同方式:


        运行时系统 IAM 角色身份验证支持的跨账户方案。

在选项 1 中,您的 Amazon EMR 集群和 Amazon EMR 执行角色与您的 Studio 账户分属不同的数据账户。您可以定义单独的 Amazon EMR 访问角色权限策略,该策略授予 Studio 执行角色代入 Amazon EMR 访问角色的权限。然后,Amazon EMR 访问角色代表您的 Studio 执行角色调用 Amazon EMR API GetClusterSessionCredentials,授予您访问集群的权限。

在选项 2 中,您的 Amazon EMR 集群和 Amazon EMR 执行角色都在您的 Studio 账户中。您的 Studio 执行角色拥有使用 Amazon EMR API GetClusterSessionCredentials 访问集群的权限。要访问 Amazon S3 存储桶,请向 Amazon EMR 执行角色授予跨账户 Amazon S3 存储桶访问权限 – 您可以在 Amazon S3 存储桶策略中授予这些权限。

在选项 3 中,您的 Amazon EMR 集群位于您的 Studio 账户中,而 Amazon EMR 执行角色位于数据账户中。您的 Studio 执行角色拥有使用 Amazon EMR API GetClusterSessionCredentials 访问集群的权限。将 Amazon EMR 执行角色添加到执行角色配置 JSON 中。然后,您可以在选择集群时在用户界面上选择角色。有关如何设置执行角色配置 JSON 文件的详细信息,请参阅将执行角色预加载到 Studio

设置 Studio 以使用运行时系统 IAM 角色

要为 Amazon EMR 集群建立运行时系统角色身份验证,请配置所需的 IAM 策略、网络和可用性增强功能。如果您的 Amazon EMR 集群和/或 Amazon EMR 执行角色位于 Amazon SageMaker Studio 账户之外,您的设置取决于您是否处理任何跨账户安排。下面的讨论将引导您了解要安装的策略、如何配置网络以允许跨账户之间的流量,以及要设置的本地配置文件,以便自动连接 Amazon EMR。

当 Amazon EMR 集群和 Studio 位于同一账户时,配置运行时系统角色身份验证

如果您的 Amazon EMR 集群位于您的 Studio 账户中,请添加基本策略以连接到 Amazon EMR 集群,并设置调用 Amazon EMR API GetClusterSessionCredentials 的权限,这样您就可以访问该集群。完成以下步骤,在 Studio 执行策略中添加必要的权限:

  1. 添加连接 Amazon EMR 集群所需的 IAM 策略。有关详细信息,请参阅从 SageMaker Studio 发现 Amazon EMR 集群

  2. 当您传递策略中指定的一个或多个允许的 Amazon EMR 执行角色时,授予调用 Amazon EMR API GetClusterSessionCredentials 的权限。

  3. (可选)授予传递遵循任何用户定义命名约定的 IAM 角色的权限。

  4. (可选)授予访问使用特定用户定义字符串标记的 Amazon EMR 集群的权限。

  5. 如果您不想手动调用 Amazon EMR 连接命令,可在本地 Amazon EFS 中安装 SageMaker 配置文件,并在选择 Amazon EMR 集群时选择要使用的角色。有关如何预加载 IAM 角色的详细信息,请参阅将执行角色预加载到 Studio

以下示例策略允许属于建模组和训练组的 Amazon EMR 执行角色调用 GetClusterSessionCredentials。此外,策略持有人可以访问使用字符串 modelingtraining 标记的 Amazon EMR 集群。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "elasticmapreduce:GetClusterSessionCredentials", "Resource": "*", "Condition": { "StringLike": { "elasticmapreduce:ExecutionRoleArn": [ "arn:aws:iam::123456780910:role/emr-execution-role-ml-modeling*", "arn:aws:iam::123456780910:role/emr-execution-role-ml-training*" ], "elasticmapreduce:ResourceTag/group": [ "*modeling*", "*training*" ] } } } ] }

当集群和 Studio 位于不同的账户中时,配置运行时系统角色身份验证

如果您的 Amazon EMR 集群不在您的 Studio 账户中,请允许您的 Studio 执行角色代入跨账户 Amazon EMR 访问角色,这样您就可以连接到集群。完成以下步骤以设置跨账户配置:

  1. 创建 Studio 执行角色权限策略,以便执行角色可以代入 Amazon EMR 访问角色。下面是一个示例策略:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAssumeCrossAccountEMRAccessRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::emr_account_id:role/emr-access-role-name" } ] }
  2. 创建信任策略,指定信任哪些 Studio 账户 ID 来代入 Amazon EMR 访问角色。下面是一个示例策略:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCrossAccountSageMakerExecutionRoleToAssumeThisRole", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::studio_account_id:role/studio_execution_role" }, "Action": "sts:AssumeRole" } }
  3. 创建 Amazon EMR 访问角色权限策略,该策略向 Amazon EMR 执行角色授予在集群上执行预期任务所需的权限。配置 Amazon EMR 访问角色,以便使用访问角色权限策略中指定的 Amazon EMR 执行角色调用 API GetClusterSessionCredentials。下面是一个示例策略:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCallingEmrGetClusterSessionCredentialsAPI", "Effect": "Allow", "Action": "elasticmapreduce:GetClusterSessionCredentials", "Resource": "", "Condition": { "StringLike": { "elasticmapreduce:ExecutionRoleArn": [ "arn:aws:iam::emr_account_id:role/emr-execution-role-name" ] } } } ] }
  4. 设置跨账户网络,使流量可以在账户之间来回移动。有关指导性说明,请参阅博文从 SageMaker Studio 创建和管理 Amazon EMR 集群以运行交互式 Spark 和 ML 工作负载 - 第 2 部分中的设置网络。博文中的步骤有助于您完成以下任务:

    1. VPC 对等 Studio 账户和 Amazon EMR 账户以建立连接。

    2. 在两个账户的私有子网路由表中手动添加路由。这允许从 Studio 账户创建 Amazon EMR 集群并将其连接到远程账户的私有子网。

    3. 设置附加到 Studio 域的安全组以允许出站流量,设置 Amazon EMR 主节点的安全组以允许来自 Studio 实例安全组的入站 TCP 流量。

  5. 如果您不想手动调用 Amazon EMR 连接命令,可在本地 Amazon EFS 中安装 SageMaker 配置文件,以便在选择 Amazon EMR 集群时选择要使用的角色。有关如何预加载 IAM 角色的详细信息,请参阅将执行角色预加载到 Studio

配置 Lake Formation 访问权限

访问由 Amazon Lake Formation 管理的数据湖中的数据时,可以使用附加到运行时系统角色的策略来执行表级和列级访问。要配置 Lake Formation 访问权限,请参阅将 Amazon EMR 与 Amazon Lake Formation 集成

将执行角色预加载到 Studio

如果您不想手动调用 Amazon EMR 连接命令,可以在本地 Amazon EFS 中安装 SageMaker 配置文件,这样就可以在选择 Amazon EMR 集群时选择要使用的执行角色。

要为 Amazon EMR 执行角色编写配置文件,请将 在 Amazon SageMaker Studio 中使用生命周期配置 (LCC) 与 Jupyter 服务器应用程序关联。或者,您也可以编写或更新配置文件,并使用以下命令重启 Jupyter 服务器:restart-jupyter-server

以下代码段是一个 LCC bash 脚本示例,如果您的 Studio 应用程序和集群在同一个账户中,就可以应用该脚本:

#!/bin/bash set -eux FILE_DIRECTORY="/home/sagemaker-user/.sagemaker-analytics-configuration-DO_NOT_DELETE" FILE_NAME="emr-configurations-DO_NOT_DELETE.json" FILE="$FILE_DIRECTORY/$FILE_NAME" mkdir -p $FILE_DIRECTORY cat << 'EOF' > "$FILE" { "emr-execution-role-arns": { "123456789012": [ "arn:aws:iam::123456789012:role/emr-execution-role-1", "arn:aws:iam::123456789012:role/emr-execution-role-2" ] } } EOF

如果 Studio 应用程序和集群位于不同账户中,请指定可以使用集群的 Amazon EMR 访问角色。在以下示例策略中,123456789012 是 Amazon EMR 集群账户的 ARN,212121212121434343434343 是允许的 Amazon EMR 访问角色的 ARN。

#!/bin/bash set -eux FILE_DIRECTORY="/home/sagemaker-user/.sagemaker-analytics-configuration-DO_NOT_DELETE" FILE_NAME="emr-configurations-DO_NOT_DELETE.json" FILE="$FILE_DIRECTORY/$FILE_NAME" mkdir -p $FILE_DIRECTORY cat << 'EOF' > "$FILE" { "emr-execution-role-arns": { "123456789012": [ "arn:aws:iam::212121212121:role/emr-execution-role-1", "arn:aws:iam::434343434343:role/emr-execution-role-2" ] } } EOF # add your cross-account EMR access role FILE_DIRECTORY="/home/sagemaker-user/.cross-account-configuration-DO_NOT_DELETE" FILE_NAME="emr-discovery-iam-role-arns-DO_NOT_DELETE.json" FILE="$FILE_DIRECTORY/$FILE_NAME" mkdir -p $FILE_DIRECTORY cat << 'EOF' > "$FILE" { "123456789012": "arn:aws:iam::123456789012:role/cross-account-emr-access-role" } EOF