在 Studio 中为访问亚马逊EMR集群配置IAM运行时角色 - Amazon SageMaker

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

在 Studio 中为访问亚马逊EMR集群配置IAM运行时角色

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

有了这项功能,您和您的队友就可以连接到同一个集群,每个人都可以使用一个运行时系统角色,该角色的权限与您访问数据的个人级别相匹配。您的会话在共享集群上也是相互隔离的。

要使用 Studio Classic 试用此功能,请参阅使用 Amazon Studi SageMaker o Classic 中的 AWS Lake Formation EMR亚马逊应用精细的数据访问控制。这篇博文可帮助您设置演示环境,在该环境中,您可以尝试使用预配置的运行时角色连接到 Amazon EMR 集群。

先决条件

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

跨账户连接方案

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

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

在选项 1 中,您的亚马逊EMR集群和亚马逊EMR运行时执行角色与 Studio 账户位于单独的数据账户中。您可以定义单独的亚马逊EMR访问角色(也称为Assumable role)权限策略,该策略向 Studio 或 Studio Classic 执行角色授予担任亚马逊EMR访问角色的权限。然后,亚马逊EMR访问角色代表您的 Studio 或 Studio Classic 执行角色调用亚马EMRAPIGetClusterSessionCredentials逊,授予您访问集群的权限。

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

在选项 3 中,您的亚马逊EMR集群位于您的 Studio 账户中,亚马逊EMR运行时执行角色位于数据账户中。您的 Studio 或 Studio Classic 执行角色有权使用亚马逊EMRAPIGetClusterSessionCredentials访问您的集群。将 Amazon EMR 运行时执行角色添加到执行角色配置中JSON。然后,您可以在选择集群时在用户界面上选择角色。有关如何设置执行角色配置JSON文件的详细信息,请参阅将你的执行角色预加载到 Studio 或 Studio 经典版

将 Studio 设置为使用运行时IAM角色

要为您的 Amazon EMR 集群建立运行时角色身份验证,请配置所需的IAM策略、网络和可用性增强。如果您的亚马逊EMR集群、Amazon EMR 运行时执行角色或两者都位于您的 Studio 账户之外,则您的设置取决于您是否处理任何跨账户安排。以下部分将指导您完成要安装的策略、如何配置网络以允许跨账户间的流量,以及为自动EMR连接 Amazon 而设置的本地配置文件。

当您的 Amazon EMR 集群和 Studio 位于同一个账户中时配置运行时角色身份验证

如果您的 Amazon EMR 集群位于您的 Studio 账户中,请完成以下步骤,为您的 Studio 执行策略添加必要的权限:

  1. 添加连接到 Amazon EMR 集群所需的IAM策略。有关详细信息,请参阅配置列出亚马逊EMR集群

  2. EMRAPIGetClusterSessionCredentials当您传递政策中指定的一个或多个允许的亚马逊EMR运行时执行角色时,授予调用 Amazon 的权限。

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

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

  5. 预加载您的IAM角色,这样您就可以在连接到 Amazon EMR 集群时选择要使用的角色。有关如何预加载IAM角色的详细信息,请参阅将你的执行角色预加载到 Studio 或 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 账户中,请允许您的 SageMaker 执行角色代入跨账户 Amazon EMR 访问角色,这样您就可以连接到集群。完成以下步骤以设置跨账户配置:

  1. 创建您的 SageMaker 执行角色权限策略,以便执行角色可以担任 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 账户IDs担任亚马逊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 访问角色配置为APIGetClusterSessionCredentials使用访问角色权限策略中指定的亚马逊EMR运行时执行角色调用。下面是一个示例策略:

    { "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. 设置跨账户网络,使流量可以在账户之间来回移动。有关指导说明,请参阅为您的 Amazon EMR 集群配置网络访问权限设置。本节中的步骤可帮助您完成以下任务:

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

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

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

  5. 预加载您的IAM运行时角色,这样您就可以在连接到 Amazon EMR 集群时选择要使用的角色。有关如何预加载IAM角色的详细信息,请参阅将你的执行角色预加载到 Studio 或 Studio 经典版

配置 Lake Formation 访问权限

当您访问由管理的数据湖中的数据时 AWS Lake Formation,您可以使用附加到您的运行时角色的策略强制执行表级和列级访问权限。要配置 Lake Formation 访问权限,请参阅将亚马逊EMR与集成 AWS Lake Formation

将你的执行角色预加载到 Studio 或 Studio 经典版

您可以预加载IAM运行时角色,以便在连接到 Amazon EMR 集群时选择要使用的角色。Studio JupyterLab 中的用户可以使用 SageMaker 控制台或提供的脚本。

Preload runtime roles in JupyterLab using the SageMaker console

要使用 SageMaker 控制台将运行时角色与您的用户配置文件或域关联起来,请执行以下操作:

  1. 导航到 SageMaker 控制台,网址为https://console.aws.amazon.com/sagemaker/

  2. 在左侧导航窗格中,选择,然后使用已更新其权限的 SageMaker 执行角色选择域。

    • 要将您的运行时(以及跨账户用例的访问角色)添加到您的域中:在域名详细信息页面的应用程序配置选项卡中,导航到该JupyterLab部分。

    • 要将您的运行时(以及跨账户用例的访问角色)添加到您的用户个人资料中:在域名详细信息页面上,选择用户配置文件选项卡,使用您更新其权限的 SageMaker 执行角色选择用户个人资料。在 “应用程序配置” 选项卡中,导航至该JupyterLab部分。

  3. 选择编辑并添加您的访问角色(假设角色)和EMR无服务器运行时执行角色。ARNs

  4. 选择提交

当您下次连接到 Amazon EMR 服务器时,运行时角色应出现在下拉菜单中以供选择。

Preload runtime roles in JupyterLab using a Python script

在使用已更新权限的 SageMaker 执行角色从空间启动的 JupyterLab 应用程序中,在终端中运行以下命令。将domainIDuser-profile-name、和emr-accountIDEMRServiceRole替换为正确的值。此代码片段在跨账户用例中更新 SageMaker 网域内的用户配置文件设置 (client.update_userprofile)。具体而言,它为 Amazon 设置了服务角色EMR。它还允许 JupyterLab 应用程序担任在亚马逊EMR账户EMR中运行亚马逊的特定IAM角色(AssumableRoleAccessRole)。

或者,如果您的空间使用client.update_domain在域级别设置的执行角色,则使用来更新域设置。

import botocore.session import json sess = botocore.session.get_session() client = sess.create_client('sagemaker') client.update_userprofile( DomainId="domainID", UserProfileName="user-profile-name", DefaultUserSettings={ 'JupyterLabAppSettings': { 'EmrSettings': { 'AssumableRoleArns': ["arn:aws:iam::emr-accountID:role/AssumableRole"], 'ExecutionRoleArns': ["arn:aws:iam::emr-accountID:role/EMRServiceRole", "arn:aws:iam::emr-accountID:role/AnotherServiceRole"] } } }) resp = client.describe_user_profile(DomainId="domainID", UserProfileName=user-profile-name") resp['CreationTime'] = str(resp['CreationTime']) resp['LastModifiedTime'] = str(resp['LastModifiedTime']) print(json.dumps(resp, indent=2))
Preload runtime roles in Studio Classic

向ARN你的 SageMaker 执行角色提供 AccessRole (AssumableRole) 的。由 Jupyter 服务器在启动时加载。ARNStudio 使用的执行角色假设该跨账户角色来发现和连接信任账户中的 Amazon EMR 集群。

您可以使用生命周期配置 (LCC) 脚本来指定此信息。您可以将附加LCC到您的域名或特定的用户个人资料。您使用的LCC脚本必须是 JupyterServer 配置。有关如何创建LCC脚本的更多信息,请参阅在 Studio Classic 中使用生命周期配置

以下是一个LCC脚本示例。要修改脚本,请将AssumableRoleemr-account替换为各自的值。交叉账户的数量限制为五个。

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

#!/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 Classic 应用程序和集群位于不同的账户中,请指定可以使用该集群的 Amazon EMR 访问角色。在以下示例策略中,123456789012是EMR亚马逊集群账户ID,212121212 121 434343434343是允许的亚马逊访问角色的ID。ARNs EMR

#!/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