在 Studio 中設定 Amazon EMR 叢集存取的 IAM 執行期角色 - Amazon SageMaker AI

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Studio 中設定 Amazon EMR 叢集存取的 IAM 執行期角色

當您從 Studio 或 Studio Classic 筆記本連線至 Amazon EMR 叢集時,您可以視覺化瀏覽稱為執行期角色的 IAM 角色清單,並即時選擇一個角色。之後,從筆記本建立的所有 Apache Spark、Apache Hive 或 Presto 任務,都只會存取連接到執行時間角色的政策所允許的資料和資源。此外,從使用 管理的資料湖存取資料時 AWS Lake Formation,您可以使用連接到執行期角色的政策來強制執行資料表層級和資料欄層級的存取。

透過這項功能,您和團隊成員可以連線到同一個叢集,每個叢集都使用執行期角色,其許可範圍將與您個別的資料存取層級相符。您的工作階段也會在共用叢集上彼此隔離。

若要使用 Studio Classic 嘗試此功能,請參閱使用 AWS Lake Formation 和來自 Amazon SageMaker Studio Classic 的 Amazon EMR 套用精細資料存取控制。這篇部落格文章可協助您設定示範環境,方便您嘗試使用預先設定的執行期角色連線至 Amazon EMR 叢集。

必要條件

開始之前,請確定您符合以下先決條件:

跨帳戶連線案例

當您的資料位於 Studio 帳戶之外時,執行期角色驗證可支援各種跨帳戶連線案例。下圖顯示三種不同的方式,您可以在 Studio 和資料帳戶之間指派 Amazon EMR 叢集、資料,甚至是 Amazon EMR 執行時間執行角色:

執行期 IAM 角色驗證支援的跨帳戶案例。

在選項 1 中,您的 Amazon EMR 叢集和 Amazon EMR 執行時間執行角色位於與 Studio 帳戶不同的資料帳戶中。您可以定義單獨的 Amazon EMR 存取角色 (也稱為 Assumable role) 許可政策,將許可授予 Studio 或 Studio Classic 執行角色以擔任 Amazon EMR 存取角色。然後,Amazon EMR 存取角色會GetClusterSessionCredentials代表 Studio 或 Studio Classic 執行角色呼叫 Amazon EMR API,讓您存取叢集。

在選項 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 或 Studio Classic 執行角色具有使用 Amazon EMR API GetClusterSessionCredentials 存取叢集的許可。將 Amazon EMR 執行時間執行角色新增至執行角色組態 JSON。接著即可在選擇叢集時在使用者介面中選取角色。如需如何設定執行角色設定 JSON 檔案的詳細資訊,請參閱將執行角色預先載入 Studio 或 Studio Classic

設定 Studio 以使用執行期 IAM 角色

若要為 Amazon EMR 叢集建立執行期角色身分驗證,請設定必要的 IAM 政策、網路和可用性增強功能。如果您的 Amazon EMR 叢集、Amazon EMR 執行時間執行角色或兩者都位於 Studio 帳戶之外,您的設定取決於您是否處理任何跨帳戶安排。下一節會引導您完成要安裝的政策、如何設定網路以允許跨帳戶之間的流量,以及設定本機組態檔案以自動化 Amazon EMR 連線。

當您的 Amazon EMR 叢集和 Studio 位於相同帳戶時,設定執行期的角色身分驗證

如果您的 Amazon EMR 叢集位於您的 Studio 帳戶中,請完成下列步驟,將必要的許可新增至您的 Studio 執行政策:

  1. 新增必要的 IAM 政策,以連線到 Amazon EMR 叢集。如需詳細資訊,請參閱 設定列出 Amazon EMR 叢集

  2. 當您傳遞政策中指定的一或多個允許的 Amazon EMR 執行期執行角色GetClusterSessionCredentials時,授予呼叫 Amazon EMR API 的許可。

  3. (選用) 授與許可,以傳遞遵循任何使用者定義命名慣例的 IAM 角色。

  4. (選用) 授與許可,以存取使用特定使用者定義字串標記的 Amazon EMR 叢集。

  5. 預先載入您的 IAM 角色,讓您可以選取要在連線至 Amazon EMR 叢集時使用的角色。如需有關預先載入 IAM 角色的詳細資訊,請參閱將執行角色預先載入 Studio 或 Studio Classic

下列範例政策允許屬於建模和訓練群組的 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 AI 執行角色擔任跨帳戶 Amazon EMR 存取角色,以便您可以連線至叢集。若要設定跨帳戶組態,請完成以下步驟:

  1. 建立 SageMaker AI 執行角色許可政策,以便執行角色可以擔任 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 存取角色設定為GetClusterSessionCredentials使用存取角色許可政策中指定的 Amazon EMR 執行期執行角色呼叫 API。以下為政策的範例:

    { "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. 手動將路由新增至兩個帳戶中的私人子網路路由表。這樣一來,將可從 Studio 帳戶建立和連線至 Amazon EMR 叢集到遠端帳戶的私有子網路。

    3. 設定連接到 Studio 網域的安全群組,以允許傳出流量和 Amazon EMR 主要節點的安全群組允許來自 Studio 執行個體安全群組的傳入 TCP 流量。

  5. 預先載入您的 IAM 執行期角色,讓您可以選取要在連線至 Amazon EMR 叢集時使用的角色。如需有關預先載入 IAM 角色的詳細資訊,請參閱將執行角色預先載入 Studio 或 Studio Classic

設定 Lake Formation 存取權

當您從 管理的資料湖存取資料時 AWS Lake Formation,您可以使用連接到執行期角色的政策來強制執行資料表層級和資料欄層級的存取。若要設定 Lake Formation 存取權限,請參閱將 Amazon EMR 與 AWS Lake Formation整合

將執行角色預先載入 Studio 或 Studio Classic

您可以預先載入 IAM 執行期角色,以便選取要在連線至 Amazon EMR 叢集時使用的角色。Studio 中 JupyterLab 的使用者可以使用 SageMaker AI 主控台或提供的指令碼。

Preload runtime roles in JupyterLab using the SageMaker AI console

若要使用 SageMaker AI 主控台將執行期角色與使用者設定檔或網域建立關聯:

  1. 導覽至 SageMaker AI 主控台,網址為 https://https://console.aws.amazon.com/sagemaker/

  2. 在左側導覽窗格中,選擇網域,然後使用您更新其許可的 SageMaker AI 執行角色選取網域。

    • 若要將執行時間 (以及跨帳戶使用案例的存取角色) 新增至您的網域:在網域詳細資訊頁面的應用程式組態索引標籤中,導覽至 JupyterLab 區段。

    • 若要將執行時間 (以及跨帳戶使用案例的存取角色) 新增至您的使用者設定檔:在網域詳細資訊頁面上,選擇使用者設定檔索引標籤,使用您更新其許可的 SageMaker AI 執行角色來選取使用者設定檔。在應用程式組態索引標籤中,導覽至 JupyterLab 區段。

  3. 選擇編輯並新增存取角色 (假設角色) 和 EMR Serverless 執行時間執行角色的 ARNs。

  4. 選擇提交

當您下次連線至 Amazon EMR 伺服器時,執行時間角色應該會出現在下拉式功能表中以供選取。

Preload runtime roles in JupyterLab using a Python script

在 JupyterLab 應用程式中,使用您更新許可的 SageMaker AI 執行角色從空間啟動,請在終端機中執行下列命令。將 domainIDemr-accountIDuser-profile-name和 取代EMRServiceRole為適當的值。此程式碼片段會更新跨帳戶使用案例中 SageMaker AI 網域中的使用者設定檔設定 (client.update_user_profile)。具體而言,它會設定 Amazon EMR 的服務角色。它還允許 JupyterLab 應用程式擔任在 Amazon EMR 帳戶中執行 Amazon EMR 的特定 IAM 角色 (AssumableRoleAccessRole)。

或者,如果您的空間使用在網域層級設定的執行角色,請使用 client.update_domain 來更新網域設定。

import botocore.session import json sess = botocore.session.get_session() client = sess.create_client('sagemaker') client.update_user_profile( DomainId="domainID", UserProfileName="user-profile-name", UserSettings={ '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

AccessRole(AssumableRole) 的 ARN 提供給您的 SageMaker AI 執行角色。ARN 會在啟動時由 Jupyter 伺服器載入。Studio 使用的執行角色會擔任跨帳戶角色,以探索和連線至信任帳戶中的 Amazon EMR 叢集。

您可以使用生命週期組態 (LCC) 指令碼來指定此資訊。您可以將 LCC 連接至您的網域或特定使用者設定檔。您使用的 LCC 指令碼必須是 JupyterServer 組態。如需如何建立 LCC 指令碼的詳細資訊,請參閱搭配 Studio Classic 使用生命週期組態

下列為範例 LCC 指令碼。若要修改指令碼,請將 AssumableRole和 取代emr-account為各自的值。跨帳戶的數量限制為 5 個。

如果您的 Studio Classic 應用程式和叢集位於相同的帳戶中,則可以套用以下程式碼片段的範例 LCC bash 指令碼:

#!/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 是 Amazon EMR 叢集帳戶 ID,212121212121434343434343 是允許 Amazon EMR 存取角色ARNs。

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