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

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

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

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

重要

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

默认角色和托管式策略

  • 默认角色名为 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 实例和权限策略创建一个服务角色,该角色对您的应用程序所需的其它AWS服务具有最低权限。

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

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

有关创建和指定自定义角色的更多信息,请参阅使用 Amazon EMR 自定义 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 位置、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/*" } ] }

使用 AWS Glue 数据目录

以下策略语句允许在将 AWS Glue 数据目录用作应用程序的元存储时所需的操作。有关更多信息,请参阅《Amazon EMR 版本指南》中的使用 AWS Glue 数据目录作为 Spark SQL 的元存储使用 AWS Glue 数据目录作为 Hive 的元存储使用 Presto 与 AWS 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": "*", } ] }