集群 EC2 实例(EC2 实例配置文件)的服务角色 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

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

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

重要

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

默认角色和托管式策略

  • 默认角色名为 EMR_EC2_DefaultRole

  • EMR_EC2_DefaultRole 默认托管式策略 AmazonElasticMapReduceforEC2Role 的支持即将结束。不要为 EC2 实例配置文件使用默认托管式策略,而是将基于资源的策略应用于 Amazon EMR 需要的 S3 桶和其他资源,或者使用您自己的客户管理型策略和 IAM 角色作为实例配置文件。有关更多信息,请参阅创建具有最小权限的集群 EC2 实例服务角色

下面显示了 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" ] } ] }

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

{ "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

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

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

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

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

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

注意

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

使用 EMRFS 读写 Amazon S3 中的数据

当在 Amazon EMR 集群上运行的应用程序引用 s3://mydata 格式的数据时,Amazon EMR 使用 EC2 实例配置文件发出请求。集群通常以这种方式在 Amazon S3 中读取和写入数据。默认情况下,Amazon EMR 使用附加到集群 EC2 实例的服务角色的权限。有关更多信息,请参阅为处理 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:ListBucket" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "sqs:GetQueueUrl", "sqs:ReceiveMessage", "sqs:DeleteQueue", "sqs:SendMessage", "sqs:CreateQueue" ], "Resource": "arn:aws:sqs:us-west-2:123456789012:EMRFS-Inconsistency-*" } ] }

将日志文件存档到 Amazon S3

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

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

使用 Amazon Glue 数据目录

以下策略声明允许您使用 Glue 数据目录作为 Amazon 应用程序的元数据仓时所需的操作。有关更多信息,请参阅《亚马逊 EM R 发布指南》中的 “使用 Amazon Glue 数据目录作为 Spark SQL 的元数据库使用 Amazon Glue 数据目录作为 Hive 的元数据仓以及将 Presto 与 Glue 数据目录一起使用 Amazon Glue 数据目录”。

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