

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

# Amazon EMR 步驟的執行期角色
<a name="emr-steps-runtime-roles"></a>

*執行期角色*是 AWS Identity and Access Management (IAM) 角色，您可以在向 Amazon EMR 叢集提交任務或查詢時指定該角色。您提交至 Amazon EMR 叢集的任務或查詢會使用執行期角色來存取 AWS 資源，例如 Amazon S3 中的物件。您可以使用 Amazon EMR 為 Spark 和 Hive 作業指定執行期角色。

當您在 Amazon SageMaker AI 中附接至 Amazon EMR 叢集，以及將 Amazon EMR Studio 工作區附接至 EMR 叢集時，也可以指定執行期角色。如需詳細資訊，請參閱[從 SageMaker AI Studio 連線至 Amazon EMR 叢集](https://docs.aws.amazon.com/sagemaker/latest/dg/connect-emr-clusters.html)和 [使用執行期角色執行 EMR Studio 工作區](emr-studio-runtime.md)。

之前，Amazon EMR 叢集使用基於附接至您用於啟動叢集之執行個體設定檔的 IAM 政策的許可，來執行 Amazon EMR 作業或查詢。這表示政策必須包含 Amazon EMR 叢集上執行之所有作業和查詢的所有許可的聯集。透過執行期角色，您現在可以單獨管理每個作業或查詢的存取控制，而無需共用叢集的 Amazon EMR 執行個體設定檔。

在具有執行期角色的 Amazon EMR 叢集上，您也可以針對資料湖套用 AWS Lake Formation Spark、Hive 和 Presto 任務和查詢的存取控制。若要進一步了解如何與 整合 AWS Lake Formation，請參閱 [將 Amazon EMR 與 整合 AWS Lake Formation](emr-lake-formation.md)。

**注意**  
當您為 Amazon EMR 步驟指定執行期角色時，您提交的任務或查詢只能存取連接到執行期角色的政策允許 AWS 的資源。這些作業和查詢無法存取叢集的 EC2 執行個體上的執行個體中繼資料服務，或使用叢集的 EC2 執行個體設定檔存取任何 AWS 資源。

## 使用執行期角色啟動 Amazon EMR 叢集的先決條件
<a name="emr-steps-runtime-roles-configure"></a>

**Topics**
+ [步驟 1：在 Amazon EMR 中設定安全組態](#configure-security)
+ [步驟 2：為 Amazon EMR 叢集設定 EC2 執行個體設定檔](#configure-ec2-profile)
+ [步驟 3：設定信任政策](#configure-trust-policy)

### 步驟 1：在 Amazon EMR 中設定安全組態
<a name="configure-security"></a>

使用下列 JSON 結構在 AWS Command Line Interface (AWS CLI) 上建立安全組態，並將 `EnableApplicationScopedIAMRole`設定為 `true`。如需有關安全組態的詳細資訊，請參閱[使用安全組態來設定 Amazon EMR 叢集安全性](emr-security-configurations.md)。

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

建議您始終在安全組態中啟用傳輸中加密選項，以便透過網際網路傳輸的資料會加密，而非純文字。如果您不想使用執行期角色從 SageMaker Runtime Studio 或 EMR Studio 連接至 Amazon EMR 叢集，則可以略過這些選項。若要設定資料加密，請參閱[設定資料加密](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-create-security-configuration.html#emr-security-configuration-encryption)。

或者，您可以使用 [AWS 管理主控台](https://console.aws.amazon.com/emr/home#/securityConfigs) 透過自訂設定來建立安全組態。

### 步驟 2：為 Amazon EMR 叢集設定 EC2 執行個體設定檔
<a name="configure-ec2-profile"></a>

Amazon EMR 叢集使用 Amazon EC2 執行個體設定檔角色擔任執行期角色。若要將執行期角色與 Amazon EMR 步驟搭配使用，請將下列政策新增至您打算用作執行個體設定檔角色的 IAM 角色。若要將政策新增至 IAM 角色或編輯現有的內嵌或受管政策，請參閱[新增和移除 IAM 身分許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowRuntimeRoleUsage",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/EMRRuntimeRole"
      ]
    }
  ]
}
```

------

### 步驟 3：設定信任政策
<a name="configure-trust-policy"></a>

針對您打算用作執行期角色的每個 IAM 角色，設定下列信任政策，並將 `EMR_EC2_DefaultRole` 取代為您的執行個體設定檔角色。若要修改 IAM 角色的信任政策，請參閱[修改角色信任政策](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-console.html)。

```
{
    "Sid":"AllowAssumeRole",
    "Effect":"Allow",
    "Principal":{
        "AWS":"arn:aws:iam::{{<AWS_ACCOUNT_ID>}}:role/EMR_EC2_DefaultRole"
    },
    "Action":[
             "sts:AssumeRole",
             "sts:TagSession"
            ]
}
```

## 啟動具有角色型存取控制的 Amazon EMR 叢集
<a name="emr-steps-runtime-roles-launch"></a>

設定組態後，您可以使用 [步驟 1：在 Amazon EMR 中設定安全組態](#configure-security) 中的安全組態啟動 Amazon EMR 叢集。若要將執行期角色與 Amazon EMR 步驟搭配使用，請使用發行標籤 `emr-6.7.0` 或更新版本，然後選取 Hive、Spark 或兩者作為您的叢集應用程式。EMR 7.6 及更高版本的執行期角色叢集支援 CloudWatchAgent。若要從 SageMaker AI Studio 連線，請使用版本 `emr-6.9.0` 或更新版本，然後選取 Livy、Spark、Hive 或 Presto 做為叢集應用程式。如需有關如何啟動叢集的指示，請參閱 [指定 Amazon EMR 叢集的安全組態](emr-specify-security-configuration.md)。

### 使用 Amazon EMR 步驟提交 Spark 作業
<a name="launch-spark"></a>

以下是如何執行 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", "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 作業
<a name="launch-hive"></a>

下列範例將 Apache Hive 與 Amazon EMR 步驟搭配使用來提交作業以執行 `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", "Jar": "command-runner.jar","Args" :["hive -
f","s3://{{DOC_EXAMPLE_BUCKET}}/QUERY_FILE.hql"] }]' \
--execution-role-arn $RUNTIME_ROLE_ARN \
--region $REGION
```

### 從 SageMaker AI Studio 筆記本使用執行期角色連線至 Amazon EMR 叢集
<a name="sagemaker"></a>

您可以將 Amazon EMR 執行期角色套用至您在 SageMaker AI Studio 的 Amazon EMR 叢集中執行的查詢。若要執行此作業，請進行下列步驟。

1. 遵循[啟動 Amazon SageMaker AI Studio]() 中的指示來建立 SageMaker AI Studio。

1. 在 SageMaker AI Studio UI 中，使用支援的核心啟動筆記本。例如，使用 PySpark 核心啟動 SparkMagic 映像。

1. 在 SageMaker AI Studio 中選擇 Amazon EMR 叢集，然後選擇**連線**。

1. 選擇執行期角色，然後選擇**連接**。

這將建立具有魔術命令的 SageMaker AI 筆記本儲存格，以使用所選的 Amazon EMR 執行期角色連接到您的 Amazon EMR 叢集。在筆記本儲存格中，您可以使用執行期角色和 Lake Formation 型存取控制來輸入和執行查詢。如需更詳細的範例，請參閱[使用 AWS Lake Formation 和來自 Amazon SageMaker AI Studio 的 Amazon EMR 套用精細資料存取控制](https://aws.amazon.com/blogs/machine-learning/apply-fine-grained-data-access-controls-with-aws-lake-formation-and-amazon-emr-from-amazon-sagemaker-studio)。

### 控制對 Amazon EMR 執行期角色的存取
<a name="role-access"></a>

您可以使用條件金鑰 `elasticmapreduce:ExecutionRoleArn` 控制對執行期角色的存取。下列政策允許 IAM 主體使用名為 `Caller` 的 IAM 角色，或任何以字串 `CallerTeamRole` 開頭的 IAM 角色作為執行期角色。

**重要**  
當您授予呼叫者呼叫 `AddJobFlowSteps` 或 `GetClusterSessionCredentials` 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 叢集之間建立信任
<a name="external-id"></a>

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 的資訊，請參閱[如何將 AWS 資源的存取權授予第三方時使用外部 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)。

### 稽核
<a name="audit-source-identity"></a>

若要監控和控制最終使用者透過 IAM 角色執行的動作，您可以開啟來源身分功能。若要進一步了解來源身分，請參閱[監控並控制使用擔任角色所採取的動作](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor)。

若要追蹤來源身分，請在安全組態中將 `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>}}
        }
    }
}
```

## 其他考量
<a name="emr-steps-runtime-roles-considerations"></a>

**注意**  
透過 Amazon EMR 版本 `emr-6.9.0`，當您從 SageMaker AI Studio 連線至 Amazon EMR 叢集時，可能會遇到間歇性故障。若要解決此問題，您可以在啟動叢集時，使用引導操作安裝修補程式。如需修補程式詳細資訊，請參閱 [Amazon EMR 6.9.0 版已知問題](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-690-release.html#emr-690-relnotes)。

此外，在設定 Amazon EMR 的執行期角色時，考慮下列事項。
+ Amazon EMR 支援所有商業 AWS 區域中的執行期角色。
+ 當您使用 `emr-6.7.0` 版或更新版本時，Amazon EMR 步驟支援具有執行期角色的 Apache Spark 和 Apache Hive 作業。
+ 當您使用版本 `emr-6.9.0`或更新版本時，SageMaker AI Studio 支援具有執行期角色的 Spark、Hive 和 Presto 查詢。
+ SageMaker AI 中的下列筆記本核心支援執行期角色：
  + DataScience–Python 3 核心
  + DataScience 2.0–Python 3 核心
  + DataScience 3.0–Python 3 核心
  + Spark 1.0–Spark 與 PySpark 核心
  + SparkAnalytics 2.0 – SparkMagic 和 PySpark 核心
  + SparkMagic – PySpark 核心
+ Amazon EMR 支援僅在叢集建立時使用 `RunJobFlow` 的步驟。此 API 不支援執行期角色。
+ Amazon EMR 不支援在您設定為高可用性的叢集上的執行期角色。
+ 從 Amazon EMR 7.5.0 版及更高版本開始，執行期角色支援檢視 Spark 和 YARN 使用者介面 (UIs)，如下所示：Spark Live UI、Spark 歷史記錄伺服器、YARN NodeManager 和 YARN ResourceManager。當您導覽至這些 UIs 時，會有使用者名稱和密碼提示。使用者名稱和密碼可透過使用 EMR GetClusterSessionCredentials API 產生。如需 API 用量詳細資訊的詳細資訊，請參閱 [GetClusterSessionCredentials](https://docs.aws.amazon.com/emr/latest/APIReference/API_GetClusterSessionCredentials.html)。

  如何使用 EMR GetClusterSessionCredentials API 的範例如下：

  ```
  aws emr  get-cluster-session-credentials --cluster-id {{<cluster_ID>}} --execution-role-arn {{<IAM_role_arn>}}
  ```
+ 使用 `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>}}
  ```

  此外，使用指令碼執行器執行命令時，您必須逸出 Bash 命令引數。以下是顯示設定 Spark 屬性的範例，其中包含逸出字元：

  ```
  "\"--conf spark.sql.autoBroadcastJoinThreshold=-1\""
  ```
+ 執行期角色不支援控制對叢集上資源 (例如 HDFS 和 HMS) 的存取。
+ 執行期角色不支援 Docker/containers。