

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

# Amazon EMR 步骤的运行时角色
<a name="emr-steps-runtime-roles"></a>

*运行时角色*是一个 Amazon Identity and Access Management (IAM) 角色，您可以在向 Amazon EMR 集群提交任务或查询时指定该角色。您提交到 Amazon EMR 集群的任务或查询使用运行时角色访问 Amazon 资源，例如 Amazon S3 中的对象。您可以使用 Amazon EMR 为 Spark 和 Hive 作业指定运行时角色。

当您在 Amazon SageMaker AI 内连接到 Amazon EMR 集群时，以及在将 Amazon EMR Studio Workspace 连接到 EMR 集群时，您也可以指定运行时系统角色。有关更多信息，请参阅[从 A SageMaker I Studio 连接到 Amazon EMR 集群和](https://docs.amazonaws.cn/sagemaker/latest/dg/connect-emr-clusters.html)。[使用运行时系统角色运行 EMR Studio Workspace](emr-studio-runtime.md)

以前，Amazon EMR 集群运行 Amazon EMR 作业或查询，其权限基于附加到您用于启动集群的实例配置文件的 IAM policy。这意味着策略必须包含在 Amazon EMR 集群上所运行所有作业和查询的所有权限的联合。使用运行时角色，您现在可以单独管理每个作业或查询的访问控制，而不是共享集群的 Amazon EMR 实例配置文件。

在具有运行时角色的 Amazon EMR 集群上，您还可以对 Spark、Hive 和 Presto 任务以及对数据湖的查询应用 Amazon Lake Formation 基于访问权限的控制。要了解有关如何与集成的更多信息 Amazon Lake Formation，请参阅[将 Amazon EMR 与 Amazon Lake Formation](emr-lake-formation.md)。

**注意**  
当您为 Amazon EMR 步骤指定运行时角色时，您提交的任务或查询只能访问附加到该运行时角色的策略允许的 Amazon 资源。这些作业和查询无法访问该集群 EC2 实例上的 Instance Metadata Service，也无法使用集群的 EC2 实例配置文件来访问任何 Amazon 资源。

## 使用运行时角色启动 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 结构在 Amazon Command Line Interface (Amazon CLI) 上创建安全配置，并将其设置`EnableApplicationScopedIAMRole`为`true`。有关安全配置的更多信息，请参阅 [使用安全配置设置 Amazon EMR 集群安全性](emr-security-configurations.md)。

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

建议您始终在安全配置中启用传输中加密选项，以便对通过互联网传输的数据进行加密，而不是以纯文本形式传输。如果您不想使用来自 SageMaker Runtime Studio 或 EMR Studio 的运行时角色连接到亚马逊 EMR 集群，则可以跳过这些选项。要配置数据加密，请参阅[配置数据加密](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-create-security-configuration.html#emr-security-configuration-encryption)。

或者，您可以使用 [Amazon Web Services 管理控制台](https://console.amazonaws.cn/emr/home#/securityConfigs) 创建具有自定义设置的安全配置。

### 步骤 2：为 Amazon EMR 集群设置 EC2 实例配置文件
<a name="configure-ec2-profile"></a>

Amazon EMR 集群使用 Amazon EC2 实例配置文件角色来带入运行时角色。要将运行时角色与 Amazon EMR 步骤配合使用，请将以下策略添加到计划用作实例配置文件角色的 IAM 角色。要向 IAM 角色添加策略或编辑现有的内联式或托管式策略，请参阅[添加和删除 IAM 身份权限](https://docs.amazonaws.cn/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.amazonaws.cn//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 或两者作为集群应用程序。 CloudWatchAgent 在 EMR 7.6 及更高版本的运行时角色集群上受支持。要从 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>

以下示例使用带有 Amazon EMR 步骤的 Apache Hive 提交任务以运行 `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
```

### 使用 AI Studio 笔记本中的运行时角色连接到 SageMaker Amazon EMR 集群
<a name="sagemaker"></a>

您可以将 Amazon EMR 运行时角色应用于在 AI Studio 的亚马逊 EMR 集群中运行的查询。 SageMaker 为此，请执行以下步骤。

1. 按照[启动 Amazon A SageMaker I Studio]() 中的说明创建 SageMaker AI Studio。

1. 在 SageMaker AI Studio 用户界面中，启动一台支持内核的笔记本电脑。例如，用 PySpark 内核启动 SparkMagic 镜像。

1. **在 A SageMaker I Studio 中选择一个 Amazon EMR 集群，然后选择 Connect。**

1. 选择运行时角色，然后选择 **Connect**（连接）。

这将创建一个带有神奇命令的 SageMaker AI 笔记本单元，使用所选的 Amazon EMR 运行时角色连接到您的 Amazon EMR 集群。在 Notebook 单元中，您可以使用运行时角色和基于 Lake Formation 的访问控制输入和运行查询。有关更详细的示例，请参阅[使用精细的数据访问控制和 Amazon AI Studio 的 Amazon Lake Formation Amaz SageMaker on EMR](https://www.amazonaws.cn/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`或的访问权限时，必须根据`elasticmapreduce:ExecutionRoleArn`上下文密钥创建条件 `GetClusterSessionCredentials` APIs，如下例所示。

```
{
    "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 的信息，请参阅在[向第三方授予对 Amazon 资源的访问权限时如何使用外部 ID](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)。

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

要使用 IAM 角色监控和控制最终用户执行的操作，您可以开启源身份功能。了解有关源身份的更多信息，请参阅[监控和控制使用所担任角色执行的操作](https://docs.amazonaws.cn/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>

**注意**  
随着亚马逊 EMR 的发布`emr-6.9.0`，当你从 AI Studio 连接到亚马逊 EMR 集群时，你可能会遇到间歇性故障。 SageMaker 要解决此问题，您可以在启动集群时通过引导操作来安装补丁。有关补丁的详细信息，请参阅 [Amazon EMR release 6.9.0 known issues](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-690-release.html#emr-690-relnotes)（Amazon EMR 发行版本 6.9.0 已知问题）。

此外，在为 Amazon EMR 配置运行时角色时，请考虑以下事项。
+ Amazon EMR 支持所有商业 Amazon Web Services 区域中的运行时角色。
+ 当您使用发行版本 `emr-6.7.0` 或更高版本时，Amazon EMR 步骤支持具有运行时角色的 Apache Spark 和 Apache Hive 作业。
+ SageMaker 当你使用发行版`emr-6.9.0`或更高版本时，AI Studio 支持带有运行时角色的 Spark、Hive 和 Presto 查询。
+  SageMaker AI 中的以下笔记本内核支持运行时角色：
  + DataScience — Python 3 内核
  + DataScience 2.0 — Python 3 内核
  + DataScience 3.0 — Python 3 内核
  + SparkAnalytics 1.0 — SparkMagic 还有内 PySpark 核
  + SparkAnalytics 2.0 — SparkMagic 还有内 PySpark 核
  + SparkMagic — PySpark 内核
+ Amazon EMR 支持仅在创建集群时使用 `RunJobFlow` 的步骤。此 API 不支持运行时角色。
+ Amazon EMR 不支持您配置为高可用性的集群上的运行时角色。
+ 从亚马逊 EMR 7.5.0 及更高版本开始，运行时角色支持查看 Spark 和 YARN 用户界面 (UIs)，例如：Spark Live 用户界面、Spark History Server NodeManager、YARN 和 YARN。 ResourceManager当您导航到它们时 UIs，会出现用户名和密码提示。用户名和密码可以通过使用 GetClusterSessionCredentials EMR API 生成。有关 API 用法详情的更多信息，请参阅[GetClusterSessionCredentials](https://docs.amazonaws.cn/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。