在服务目录中配置 Amazon EMR CloudFormation 模板 - Amazon SageMaker

在服务目录中配置 Amazon EMR CloudFormation 模板

本主题假定管理员熟悉 AWS CloudFormationAWS Service Catalog 中的投资组合和产品以及 Amazon EMR

为了简化从 Studio 创建 Amazon EMR 集群的过程,管理员可以将 Amazon EMR CloudFormation 模板注册为 AWS Service Catalog 组合中的产品。要向数据科学家提供模板,他们必须将组合与 Studio 或 Studio Classic 中使用的 SageMaker 执行角色关联起来。最后,要允许用户从 Studio 或 Studio Classic 发现模板、配置集群并连接到 Amazon EMR 集群,管理员需要设置适当的访问权限。

Amazon EMR AWS CloudFormation 模板可让最终用户自定义集群的各个方面。例如,管理员可以定义已批准的实例类型列表,供用户在创建集群时选择。

以下说明使用端到端 CloudFormation 堆栈来设置 Studio 或 Studio Classic 域、用户配置文件、服务目录组合,并填充 Amazon EMR 启动模板。以下步骤强调了管理员必须在端到端堆栈中应用的特定设置,以启用 Studio 或 Studio Classic 访问服务目录产品并配置 Amazon EMR 集群。

注意

GitHub 存储库 aws-samples/sagemaker-studio-emr 包含端到端 CloudFormation 堆栈示例,可部署必要的 IAM 角色、网络、SageMaker 域、用户配置文件、服务目录组合,并添加 Amazon EMR 启动 CloudFormation 模板。这些模板在 Studio 或 Studio Classic 与 Amazon EMR 集群之间提供不同的身份验证选项。在这些示例模板中,父 CloudFormation 堆栈将 SageMaker VPC、安全组和子网参数传递给 Amazon EMR 集群模板。

sagemaker-studio-emr/cloudformation/emr_servicecatalog_templates 存储库包含各种 Amazon EMR CloudFormation 启动模板示例,包括用于单账户和跨账户部署的选项。

有关可用于连接 Amazon EMR 集群的身份验证方法的详细信息,请参阅 从 SageMaker Studio 或 Studio Classic 连接到 Amazon EMR 集群

要让数据科学家从 Studio 或 Studio Classic 发现 Amazon EMR CloudFormation 模板并配置集群,请按照以下步骤操作。

步骤 0:检查网络并准备 CloudFormation 堆栈

开始之前:

  • 确保已查看 为 Amazon EMR 集群配置网络访问权限 中的联网和安全要求。

  • 您必须有一个现有的端到端 CloudFormation 协议栈,该协议栈支持您选择的身份验证方法。您可以在 aws-samples/sagemaker-studio-emr GitHub 存储库中找到此类 CloudFormation 模板的示例。以下步骤强调了端到端堆栈中的具体配置,以便在 Studio 或 Studio Classic 中使用 Amazon EMR 模板。

步骤 1:将服务目录组合与 SageMaker 关联起来

在服务目录组合中,将组合 ID 与访问集群的 SageMaker 执行角色关联。

为此,请在堆栈中添加以下部分(此处为 YAML 格式)。这样,SageMaker 执行角色就可以访问指定的服务目录组合,其中包含 Amazon EMR 模板等产品。它允许 SageMaker 承担的角色推出这些产品。

用实际值替换 SageMakerExecutionRole.ArnSageMakerStudioEMRProductPortfolio.ID

SageMakerStudioEMRProductPortfolioPrincipalAssociation: Type: AWS::ServiceCatalog::PortfolioPrincipalAssociation Properties: PrincipalARN: SageMakerExecutionRole.Arn PortfolioId: SageMakerStudioEMRProductPortfolio.ID PrincipalType: IAM

有关所需的 IAM 权限集的详细信息,请参阅权限部分。

步骤 2:在服务目录产品中引用 Amazon EMR 模板

在产品组合的服务目录产品中,引用 Amazon EMR 模板资源并确保其在 Studio 或 Studio Classic 中可见。

为此,请在服务目录产品定义中引用 Amazon EMR 模板资源,然后添加以下设置为 "true" 值的标签键 "sagemaker:studio-visibility:emr"(请参阅 YAML 格式的示例)。

在服务目录产品定义中,集群的 AWS CloudFormation 模板是通过 URL 引用的。将附加标记设置为 true 可确保 Amazon EMR 模板在 Studio 或 Studio Classic 中的可见性。

注意

示例中提供的 URL 所引用的 Amazon EMR 模板在启动时不会强制执行任何身份验证要求。该选项用于演示和学习。不建议在生产环境中使用。

SMStudioEMRNoAuthProduct: Type: AWS::ServiceCatalog::CloudFormationProduct Properties: Owner: AWS Name: SageMaker Studio Domain No Auth EMR ProvisioningArtifactParameters: - Name: SageMaker Studio Domain No Auth EMR Description: Provisions a SageMaker domain and No Auth EMR Cluster Info: LoadTemplateFromURL: Link to your CloudFormation template. For example, https://aws-blogs-artifacts-public.s3.amazonaws.com/artifacts/astra-m4-sagemaker/end-to-end/CFN-EMR-NoStudioNoAuthTemplate-v3.yaml Tags: - Key: "sagemaker:studio-visibility:emr" Value: "true"

步骤 3:参数化 Amazon EMR CloudFormation 模板

用于在服务目录产品中定义 Amazon EMR 集群的 CloudFormation 模板允许管理员指定可配置的参数。管理员可在模板的 Parameters 部分为这些参数定义 Default 值和 AllowedValues 范围。在集群启动过程中,数据科学家可以提供自定义输入或从这些预定义选项中进行选择,以自定义其 Amazon EMR 集群的某些方面。

以下示例说明了管理员在创建 Amazon EMR 模板时可以设置的其他输入参数。

"Parameters": { "EmrClusterName": { "Type": "String", "Description": "EMR cluster Name." }, "MasterInstanceType": { "Type": "String", "Description": "Instance type of the EMR master node.", "Default": "m5.xlarge", "AllowedValues": [ "m5.xlarge", "m5.2xlarge", "m5.4xlarge" ] }, "CoreInstanceType": { "Type": "String", "Description": "Instance type of the EMR core nodes.", "Default": "m5.xlarge", "AllowedValues": [ "m5.xlarge", "m5.2xlarge", "m5.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge" ] }, "CoreInstanceCount": { "Type": "String", "Description": "Number of core instances in the EMR cluster.", "Default": "2", "AllowedValues": [ "2", "5", "10" ] }, "EmrReleaseVersion": { "Type": "String", "Description": "The release version of EMR to launch.", "Default": "emr-5.33.1", "AllowedValues": [ "emr-5.33.1", "emr-6.4.0" ] } }

管理员在 Studio 中提供 Amazon EMR CloudFormation 模板后,数据科学家就可以使用它们来自行配置 Amazon EMR 集群。模板中定义的 Parameters 部分将转化为 Studio 或 Studio Classic 中集群创建表单上的输入字段。对于每个参数,数据科学家既可以在输入框中输入自定义值,也可以从下拉菜单中列出的预定义选项中进行选择,这些选项与模板中指定的 AllowedValues 相对应。

下图显示了从 CloudFormation Amazon EMR 模板组装的动态表单,用于在 Studio 或 Studio Classic 中创建 Amazon EMR 集群。

从 CloudFormation Amazon EMR 模板组装的动态表单示例,用于从 Studio 或 Studio Classic 创建 Amazon EMR 集群。

访问 从 Studio 或 Studio Classic 启动 Amazon EMR 集群 了解如何使用这些 Amazon EMR 模板从 Studio 或 Studio Classic 启动集群。

步骤 4:设置权限以启用从 Studio 列出和启动 Amazon EMR 集群

最后,附加所需的 IAM 权限,以启用从 Studio 或 Studio Classic 列出现有正在运行的 Amazon EMR 集群和自配置新集群。

您必须添加这些权限的角色取决于 Studio 或 Studio Classic 和 Amazon EMR 是部署在同一账户(选择单账户)还是不同账户(选择跨账户)中。

重要

您只能为从专用空间启动的 JupyterLab 和 Studio Classic 应用程序发现和连接 Amazon EMR 集群。确保 Amazon EMR 集群与您的 Studio 环境位于同一 AWS 区域。

如果 Amazon EMR 集群和 Studio 或 Studio Classic 部署在同一个 AWS 账户中,请为访问集群的 SageMaker 执行角色附加以下权限。

  1. 步骤 1:读取专用空间使用的 SageMaker 执行角色的 ARN。

    有关 SageMaker 中空间和执行角色的信息,请参阅 了解域空间权限和执行角色

    有关如何检索 SageMaker 执行角色的 ARN 的更多信息,请参阅 获取执行角色

  2. 步骤 2:为访问 Amazon EMR 集群的 SageMaker 执行角色附加以下权限。

    1. 导航到 IAM 控制台

    2. 选择角色,然后在搜索字段中按名称搜索执行角色。角色名称是 ARN 的最后一部分,位于最后一个正斜线 (/) 之后。

    3. 点击链接进入您的角色。

    4. 选择添加权限,然后选择创建内联策略

    5. JSON 选项卡中,添加允许 Amazon EMR 访问和操作的 Amazon EMR 权限。有关策略文件的详细信息,请参阅 参考策略 中的列出 Amazon EMR 策略。用实际值替换 regionaccountID,然后将语句列表复制到角色的内联策略中。

    6. 选择下一步,然后提供一个策略名称

    7. 选择创建策略

    8. 重复创建内联策略步骤,添加另一个策略,授予执行角色使用 AWS CloudFormation 模板配置新 Amazon EMR 集群的权限。有关策略文档的详细信息,请参阅 参考策略 中的创建 Amazon EMR 集群策略。用实际值替换 regionaccountID,然后将语句列表复制到角色的内联策略中。

注意

基于角色的访问控制 (RBAC) 连接到 Amazon EMR 集群的用户也应参考 当 Amazon EMR 集群和 Studio 位于同一账户时,配置运行时系统角色身份验证

开始之前,请检索专用空间使用的 SageMaker 执行角色的 ARN。

有关 SageMaker 中空间和执行角色的信息,请参阅 了解域空间权限和执行角色

有关如何检索 SageMaker 执行角色的 ARN 的更多信息,请参阅 获取执行角色

如果 Amazon EMR 集群和 Studio 或 Studio Classic 分别部署在不同的 AWS 账户中,则需要在这两个账户上配置权限。

注意

基于角色的访问控制 (RBAC) 连接到 Amazon EMR 集群的用户也应参考 当集群和 Studio 位于不同的账户中时,配置运行时系统角色身份验证

在 Amazon EMR 集群账户上

请按照以下步骤在部署 Amazon EMR 的账户(也称为信任账户)上创建必要的角色和策略:

  1. 步骤 1:读取 Amazon EMR 集群服务角色的 ARN

    要了解如何查找集群服务角色的 ARN,请参阅为 Amazon EMR 对 AWS 服务和资源的权限配置 IAM 服务角色

  2. 步骤 2:使用以下配置创建名为 AssumableRole 的自定义 IAM 角色:

    • 权限:向 AssumableRole 授予必要的权限,以允许访问 Amazon EMR 资源。在涉及跨账户访问的情况下,该角色也称为访问角色

    • 信任关系:为 AssumableRole 配置信任策略,以允许从需要访问的 Studio 账户承担执行角色(跨账户图中的 SageMakerExecutionRole)。

    通过担任该角色,Studio 或 Studio Classic 可以临时访问 Amazon EMR 中所需的权限。

    有关如何在 Amazon EMR AWS 账户中创建新 AssumableRole 的详细说明,请按照以下步骤操作:

    1. 导航到 IAM 控制台

    2. 在左侧导航窗格中,选择策略,然后选择创建策略

    3. JSON 选项卡中,添加允许 Amazon EMR 访问和操作的 Amazon EMR 权限。有关策略文件的详细信息,请参阅 参考策略 中的列出 Amazon EMR 策略。用实际值替换 regionaccountID,然后将语句列表复制到角色的内联策略中。

    4. 选择下一步,然后提供一个策略名称

    5. 选择创建策略

    6. 在左侧导航窗格中,选择角色,然后选择创建角色

    7. 创建角色页面上,选择自定义信任策略作为受信任实体。

    8. 自定义信任策略部分粘贴以下 JSON 文档,然后选择下一步

      For users of Studio and JupyterLab

      studio-account 替换为 Studio 帐户 ID,将 AmazonSageMaker-ExecutionRole 替换为 JupyterLab 空间使用的执行角色。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::studio-account:role/service-role/AmazonSageMaker-ExecutionRole" }, "Action": "sts:AssumeRole" } ] }
      For users of Studio Classic

      studio-account 替换为 Studio Classic 帐户 ID。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::studio-account:root" }, "Action": "sts:AssumeRole" } ] }
    9. 添加权限页面上,添加刚刚创建的权限,然后选择下一步

    10. 审查页面上,输入角色名称(如 AssumableRole)和可选描述。

    11. 检查角色详细信息,然后选择 Create role

    有关在 AWS 账户上创建角色的更多信息,请参阅创建 IAM 角色(管理控制台)

Studio 账户

在部署 Studio 的账户(也称为受信任账户)上,更新访问集群的 SageMaker 执行角色,使其具有访问受信任账户资源所需的权限。

  1. 步骤 1:读取专用空间使用的 SageMaker 执行角色的 ARN。

    有关 SageMaker 中空间和执行角色的信息,请参阅 了解域空间权限和执行角色

    有关如何检索 SageMaker 执行角色的 ARN 的更多信息,请参阅 获取执行角色

  2. 步骤 2:为访问 Amazon EMR 集群的 SageMaker 执行角色附加以下权限。

    1. 导航到 IAM 控制台

    2. 选择角色,然后在搜索字段中按名称搜索执行角色。角色名称是 ARN 的最后一部分,位于最后一个正斜线 (/) 之后。

    3. 点击链接进入您的角色。

    4. 选择添加权限,然后选择创建内联策略

    5. JSON 选项卡中,添加授予角色更新域、用户配置文件和空间权限的内联策略。有关策略文档的详细信息,请参阅 参考策略 中的域、用户配置文件和空间更新操作策略。用实际值替换 regionaccountID,然后将语句列表复制到角色的内联策略中。

    6. 选择下一步,然后提供一个策略名称

    7. 选择创建策略

    8. 重复创建内联策略步骤,添加另一个策略,授予执行角色使用 AssumableRole 的权限,然后执行角色访问策略允许的操作。将 emr-account 替换为 Amazon EMR 帐户 ID,将 AssumableRole 替换为 Amazon EMR 帐户中创建的可承担角色的名称。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRoleAssumptionForCrossAccountDiscovery", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": ["arn:aws:iam::emr-account:role/AssumableRole" ] }] }
    9. 重复创建内联策略步骤,添加另一个策略,授予执行角色使用 AWS CloudFormation 模板配置新 Amazon EMR 集群的权限。有关策略文档的详细信息,请参阅 参考策略 中的 创建 Amazon EMR 群集策略。用实际值替换 regionaccountID,然后将语句列表复制到角色的内联策略中。

    10. (可选)要允许列出与 Studio 部署在同一账户中的 Amazon EMR 集群,请按照 参考策略 中的列出 Amazon EMR 策略中的定义,在 Studio 执行角色中添加额外的内联策略。

  3. 步骤 3:将您的可承担角色(访问角色)与您的域或用户配置文件关联起来。JupyterLab in Studio 用户可以使用 SageMaker 管理控制台或提供的脚本。

    选择与您的使用场景相对应的选项卡。

    Associate your assumable roles in JupyterLab using the SageMaker console

    使用 SageMaker 管理控制台将可承担的角色与用户配置文件或域关联起来:

    1. 导航到位于 https://console.aws.amazon.com/sagemaker/ 的 SageMaker 控制台。

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

      • 在域中添加可承担的角色(访问角色):在域详细信息页面的应用程序配置选项卡中,导航至 JupyterLab 部分。

      • 在用户配置文件中添加可承担的角色(访问角色):在域详细信息页面上,选择用户配置文件选项卡,选择使用 SageMaker 执行角色的用户配置文件,您更新了该角色的权限。在应用程序配置选项卡中,导航至 JupyterLab 部分。

    3. 选择编辑,然后添加可承担角色(访问角色)的 ARN。

    4. 选择提交

    Associate your assumable roles in JupyterLab using a Python script

    在使用已更新权限的 SageMaker 执行角色从空间启动的 JupyterLab 应用程序中,在终端运行以下命令。用适当的值替换 domainIDuser-profile-nameemr-accountIDAssumableRoleRBAC 运行时角色EMRServiceRole)。此代码片段更新 SageMaker 域内特定用户配置文件(使用 client.update_userprofile)的用户配置文件设置或域设置(使用 client.update_domain)。具体来说,它允许 JupyterLab 应用程序承担特定的 IAM 角色 (AssumableRole),以便在 Amazon EMR 账户内运行 Amazon EMR 集群。

    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))
    For users of Studio Classic

    为您的 Studio Classic 执行角色提供 AssumableRole 的 ARN。Jupyter 服务器会在启动时加载 ARN。Studio 使用的执行角色假定为跨账户角色,以发现并连接到信任账户中的 Amazon EMR 集群。

    您可以使用生命周期配置 (LCC) 脚本指定这些信息。您可以将 LCC 附加到域或特定用户配置文件。您使用的 LCC 脚本必须采用 JupyterServer 配置。有关如何创建 LCC 脚本的更多信息,请参阅在 Studio Classic 中使用生命周期配置

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

    # This script creates the file that informs Studio Classic that the role "arn:aws:iam::emr-account:role/AssumableRole" in remote account "emr-account" must be assumed to list and describe Amazon EMR clusters in the remote account. #!/bin/bash set -eux 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 > "$FILE" <<- "EOF" { emr-cross-account1: "arn:aws:iam::emr-cross-account1:role/AssumableRole", emr-cross-account2: "arn:aws:iam::emr-cross-account2:role/AssumableRole" } EOF

    在 LCC 运行并且文件写入之后,服务器读取文件 /home/sagemaker-user/.cross-account-configuration-DO_NOT_DELETE/emr-discovery-iam-role-arns-DO_NOT_DELETE.json 并存储跨账户 ARN。