Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

集群 EC2 实例的服务角色(EC2 实例配置文件)

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

有关 EC2 实例的服务角色的更多信息,请参阅 IAM 用户指南 中的使用 IAM 角色向在 Amazon EC2 实例上运行的应用程序授予权限

重要

默认集群 EC2 实例的服务角色及其使用的托管策略配置了允许您尽可能轻松地创建功能完善的集群所需的权限。我们强烈建议您修改该策略,以提供应用程序所需的最小权限。有关更多信息,请参阅 创建具有最小权限的集群 EC2 实例服务角色

默认角色和托管策略

  • 默认角色是 EMR_EC2_DefaultRole

  • 附加到 EMR_EC2_DefaultRole 的默认托管策略是 AmazonElasticMapReduceforEC2Role

AmazonElasticMapReduceforEC2Role 版本 3 的内容如下所示。

{ "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" ] } ] }

创建具有最小权限的集群 EC2 实例服务角色

作为一项最佳实践,我们强烈建议您创建集群 EC2 实例的服务角色和权限策略,使其具有您的应用程序需要的其他 AWS 服务的最小权限。

默认托管策略 AmazonElasticMapReduceforEC2Role 提供可轻松启动初始集群的权限。但是,Amazon EMR 不需要任何权限就能启动、监视和管理基本集群。如果您以这种方式在没有权限的情况下启动集群,则仍会创建集群,并使用备用授权方法生成系统日志和将其推送到 Amazon EMR 拥有的 Amazon S3 存储桶。但是,集群应用程序将无法与其他 AWS 服务进行交互。例如,集群将无法读写 Amazon S3。

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

有关创建和指定自定义角色的更多信息,请参阅自定义 IAM 角色

注意

如果您为 EC2 创建自定义 EMR 角色,请遵循基本工作流程,这将自动创建同名的实例配置文件。Amazon EC2 允许您创建名称不同的实例配置文件和角色,但 Amazon EMR 不支持此配置,并且它将在您创建群集时导致“invalid instance profile”(实例配置文件无效) 错误。

使用 EMRFS 读写 Amazon S3 中的数据

当在 Amazon EMR 集群上运行的应用程序使用 s3://mydata 格式引用数据时,Amazon EMR 使用 EMRFS 发出请求。集群通常以这种方式读写 Amazon S3 中的数据,EMRFS 默认使用附加到集群 EC2 实例的服务角色的权限。当您拥有多个集群用户和多个数据存储时,您可能希望用户拥有对 Amazon S3 中的 EMRFS 数据的不同权限。为此,您可以将 IAM 角色用于 EMRFS。这允许 EMRFS 根据发出请求的用户或组,或者根据 EMRFS 数据在 Amazon S3 中的位置,通过不同的权限策略代入不同角色。有关更多信息,请参阅 为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色

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

下面的示例语句演示了 EMRFS 向 Amazon S3 发出请求所需的权限。

  • my-data-bucket-in-s3-for-emrfs-reads-and-writes 指定 Amazon S3 中的存储桶 - 集群使用 /* 读写数据以及所有子文件夹。请仅添加您的应用程序需要的存储桶和文件夹。

  • 仅当启用 EMRFS 一致性视图时,才需要允许 dynamodb 操作的策略语句。EmrFSMetadata 指定 EMRFS 一致视图的默认文件夹。有关更多信息,请参阅 启用一致视图

{ "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/*" ] }, { "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:us-west-2:123456789012:table/EmrFSMetadata" }, { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData", "dynamodb:ListTables", "s3:HeadBucket" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "sqs:GetQueueUrl", "sqs:DeleteMessageBatch", "sqs:ReceiveMessage", "sqs:DeleteQueue", "sqs:SendMessage", "sqs:CreateQueue" ], "Resource": "arn:aws:sqs:us-west-2:123456789012:EMRFS-Inconsistency-*" } }

将日志文件存档到 Amazon S3

以下策略语句允许 Amazon EMR 集群将日志文件存档到指定的 Amazon S3 位置。在下面的示例中,创建集群时,在控制台中使用 Log folder S3 location (日志文件夹 S3 位置)、从 AWS CLI 使用 --log-uri 选项或在 RunJobFlow 命令中使用 LogUri 参数指定 s3://MyLoggingBucket/MyEMRClusterLogs。有关更多信息,请参阅 将日志文件存档到 Amazon S3

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

使用调试工具

以下策略语句允许在启用 Amazon EMR 调试工具时所需的操作。调试需要将日志文件存档到 Amazon S3,以及上面示例中所示的相关权限。有关更多信息,请参阅 启用调试工具

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:GetQueueUrl", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:us-west-2:123456789012:AWS-ElasticMapReduce-*" } ] }

使用 AWS Glue Data Catalog

以下策略语句允许在将 AWS Glue Data Catalog 用作应用程序的元存储时所需的操作。有关更多信息,请参阅 Amazon EMR 版本指南 中的使用 AWS Glue Data Catalog 作为 Spark SQL 的元存储使用 AWS Glue Data Catalog 作为 Hive 的元存储将 Presto 与 AWS Glue Data Catalog 结合使用

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "*", "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" ] } ] }