

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

# 集群 EC2 实例（EC2 实例配置文件）的服务角色
<a name="emr-iam-role-for-ec2"></a>

集群 EC2 实例的服务角色（又称为 Amazon EMR 的 EC2 实例配置文件）是一种特殊类型的服务角色，在实例启动时分配给 Amazon EMR 集群中的每个 EC2 实例。在 Hadoop 生态系统之上运行的应用程序进程代入该角色来获得与其它 Amazon 服务交互的权限。

有关 EC2 实例的服务角色的更多信息，请参阅《IAM 用户指南》**中的[使用 IAM 角色为 Amazon EC2 实例上运行的应用程序授予权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)。

**重要**  
集群 EC2 实例的默认服务角色及其关联的 Amazon 默认托管策略即将被弃用，没有提供替代的 Amazon 托管策略。`AmazonElasticMapReduceforEC2Role`您需要创建并指定实例配置文件以替换弃用的角色和默认策略。

## 默认角色和托管式策略
<a name="emr-ec2-role-default"></a>
+ 默认角色名为 `EMR_EC2_DefaultRole`。
+ `EMR_EC2_DefaultRole` 默认托管式策略 `AmazonElasticMapReduceforEC2Role` 的支持即将结束。不要为 EC2 实例配置文件使用默认托管式策略，而是将基于资源的策略应用于 Amazon EMR 需要的 S3 桶和其他资源，或者使用您自己的客户管理型策略和 IAM 角色作为实例配置文件。有关更多信息，请参阅 [创建具有最小权限的集群 EC2 实例服务角色](#emr-ec2-role-least-privilege)。

下面显示了 `AmazonElasticMapReduceforEC2Role` 版本 3 的内容。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Action": [
        "cloudwatch:*",
        "dynamodb:*",
        "ec2:Describe*",
        "elasticmapreduce:Describe*",
        "elasticmapreduce:ListBootstrapActions",
        "elasticmapreduce:ListClusters",
        "elasticmapreduce:ListInstanceGroups",
        "elasticmapreduce:ListInstances",
        "elasticmapreduce:ListSteps",
        "kinesis:CreateStream",
        "kinesis:DeleteStream",
        "kinesis:DescribeStream",
        "kinesis:GetRecords",
        "kinesis:GetShardIterator",
        "kinesis:MergeShards",
        "kinesis:PutRecord",
        "kinesis:SplitShard",
        "rds:Describe*",
        "s3:*",
        "sdb:*",
        "sns:*",
        "sqs:*",
        "glue:CreateDatabase",
        "glue:UpdateDatabase",
        "glue:DeleteDatabase",
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:CreateTable",
        "glue:UpdateTable",
        "glue:DeleteTable",
        "glue:GetTable",
        "glue:GetTables",
        "glue:GetTableVersions",
        "glue:CreatePartition",
        "glue:BatchCreatePartition",
        "glue:UpdatePartition",
        "glue:DeletePartition",
        "glue:BatchDeletePartition",
        "glue:GetPartition",
        "glue:GetPartitions",
        "glue:BatchGetPartition",
        "glue:CreateUserDefinedFunction",
        "glue:UpdateUserDefinedFunction",
        "glue:DeleteUserDefinedFunction",
        "glue:GetUserDefinedFunction",
        "glue:GetUserDefinedFunctions"
      ],
      "Sid": "AllowCLOUDWATCH"
    }
  ]
}
```

------

您的服务角色应该使用下面的信任策略。

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

****  

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

------

## 创建具有最小权限的集群 EC2 实例服务角色
<a name="emr-ec2-role-least-privilege"></a>

作为最佳实践，我们强烈建议您为集群 EC2 实例创建服务角色和具有应用程序所需其他 Amazon 服务最低权限的权限策略。

默认托管式策略 `AmazonElasticMapReduceforEC2Role` 提供可轻松启动初始集群的权限。但是，`AmazonElasticMapReduceforEC2Role`即将被弃用，Amazon EMR 不会为已弃用的角色提供 Amazon 替代的托管默认策略。要启动初始集群，您需要提供基于客户管理的资源或基于 ID 的策略。

以下策略语句提供了 Amazon EMR 不同功能所需权限的示例。我们建议您使用这些权限创建权限策略，将访问权限限制为您的集群所需的功能和资源。所有示例政策声明都使用*us-west-2*地区和虚构的 Amazon 账户 ID。*123456789012*请将它们替换为适合您集群的值。

有关创建和指定自定义角色的更多信息，请参阅[使用 Amazon EMR 自定义 IAM 角色](emr-iam-roles-custom.md)。

**注意**  
如果您为 EC2 创建自定义 EMR 角色，请按照基本工作流程自动创建同名实例配置文件。Amazon EC2 允许您创建不同名称的实例配置文件和角色，但 Amazon EMR 不支持此配置，并且在您创建集群时会导致“invalid instance profile”错误。

### 使用 EMRFS 读写 Amazon S3 中的数据
<a name="emr-ec2-role-EMRFS"></a>

当在 Amazon EMR 集群上运行的应用程序引用 `s3://mydata` 格式的数据时，Amazon EMR 使用 EC2 实例配置文件发出请求。集群通常以这种方式在 Amazon S3 中读取和写入数据。默认情况下，Amazon EMR 使用附加到集群 EC2 实例的服务角色的权限。有关更多信息，请参阅[为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色](emr-emrfs-iam-roles.md)。

由于 EMRFS 的 IAM 角色将回退到附加到集群 EC2 实例服务角色的权限，因此作为一项最佳实践，我们建议您对 EMRFS 使用 IAM 角色，并限制附加到集群 EC2 实例服务角色的 EMRFS 和 Amazon S3 权限。

下面的示例语句演示了 EMRFS 向 Amazon S3 发出请求所需的权限。
+ *my-data-bucket-in-s3-for-emrfs-reads-and-writes* 指定 Amazon S3 中的桶，在该桶中，集群使用 */\$1* 读取和写入数据和所有子文件夹。请仅添加您的应用程序需要的存储桶和文件夹。
+ 只有在启用 EMRFS 一致视图时，才需要允许 `dynamodb` 操作的策略声明。*EmrFSMetadata* 为 EMRFS 一致视图指定默认文件夹。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:CreateBucket",
        "s3:DeleteObject",
        "s3:GetBucketVersioning",
        "s3:GetObject",
        "s3:GetObjectTagging",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads",
        "s3:ListBucketVersions",
        "s3:ListMultipartUploadParts",
        "s3:PutBucketVersioning",
        "s3:PutObject",
        "s3:PutObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::my-data-bucket-in-s3-for-emrfs-reads-and-writes",
        "arn:aws:s3:::my-data-bucket-in-s3-for-emrfs-reads-and-writes/*"
      ],
      "Sid": "AllowS3Abortmultipartupload"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:BatchGetItem",
        "dynamodb:BatchWriteItem",
        "dynamodb:PutItem",
        "dynamodb:DescribeTable",
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:Scan",
        "dynamodb:Query",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteTable",
        "dynamodb:UpdateTable"
      ],
      "Resource": [
        "arn:aws:dynamodb:*:123456789012:table/EmrFSMetadata"
      ],
      "Sid": "AllowDYNAMODBCreatetable"
    },
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData",
        "dynamodb:ListTables",
        "s3:ListBucket"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowCLOUDWATCHPutmetricdata"
    },
    {
      "Effect": "Allow",
      "Action": [
        "sqs:GetQueueUrl",
        "sqs:ReceiveMessage",
        "sqs:DeleteQueue",
        "sqs:SendMessage",
        "sqs:CreateQueue"
      ],
      "Resource": [
        "arn:aws:sqs:*:123456789012:EMRFS-Inconsistency-*"
      ],
      "Sid": "AllowSQSGetqueueurl"
    }
  ]
}
```

------

### 将日志文件存档到 Amazon S3
<a name="emr-ec2-role-s3-logs"></a>

以下策略语句允许 Amazon EMR 集群将日志文件存档到指定的 Amazon S3 位置。在以下示例中，创建集群*s3://MyLoggingBucket/MyEMRClusterLogs*时，使用控制台中的**日志文件夹 S3 位置** Amazon CLI、中的`--log-uri`选项或`RunJobFlow`命令中的`LogUri`参数进行指定。有关更多信息，请参阅 [将日志文件归档到 Amazon S3](emr-plan-debugging.md#emr-plan-debugging-logs-archive)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::MyLoggingBucket/MyEMRClusterLogs/*"
      ],
      "Sid": "AllowS3Putobject"
    }
  ]
}
```

------

### 使用 Amazon Glue 数据目录
<a name="emr-ec2-role-glue"></a>

以下策略声明允许您使用 Glue 数据目录作为 Amazon 应用程序的元数据仓时所需的操作。有关更多信息，请参阅《亚马逊 *EM* R 发布指南》[中的 [“使用 Amazon Glue 数据目录作为 Spark SQL 的元数据库](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-spark-glue.html)、[使用 Amazon Glue 数据目录作为 Hive 的元数据仓](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html)以及将 Presto 与 Glue 数据目录一起使用 Amazon Glue 数据](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-presto-glue.html)目录”。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:CreateDatabase",
        "glue:UpdateDatabase",
        "glue:DeleteDatabase",
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:CreateTable",
        "glue:UpdateTable",
        "glue:DeleteTable",
        "glue:GetTable",
        "glue:GetTables",
        "glue:GetTableVersions",
        "glue:CreatePartition",
        "glue:BatchCreatePartition",
        "glue:UpdatePartition",
        "glue:DeletePartition",
        "glue:BatchDeletePartition",
        "glue:GetPartition",
        "glue:GetPartitions",
        "glue:BatchGetPartition",
        "glue:CreateUserDefinedFunction",
        "glue:UpdateUserDefinedFunction",
        "glue:DeleteUserDefinedFunction",
        "glue:GetUserDefinedFunction",
        "glue:GetUserDefinedFunctions"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowGLUECreatedatabase"
    }
  ]
}
```

------