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

使用 IAM 策略来允许和拒绝用户权限

Amazon EMR 支持 AWS Identity and Access Management (IAM) 策略。IAM 是一项 Web 服务,可让 AWS 客户管理用户及其权限。您可以使用 IAM 来创建策略并将其附加到委托人,如用户和组。这些策略将授予或拒绝权限,并确定用户可使用 Amazon EMR 和其他 AWS 资源执行的操作。例如,可以允许用户查看 AWS 账户中的 EMR 集群,但不允许创建或删除这些集群。此外,您可以为 EMR 集群添加标签,然后使用这些标签对各个集群中的用户或一组共享同一标签的集群中的用户应用细粒度权限。

IAM 可供所有 AWS 账户持有人免费使用。您不需要注册 IAM。您可以通过 Amazon EMR 控制台和 AWS CLI 使用 IAM。您还可以通过 Amazon EMR API 和 AWS 开发工具包以编程方式使用它。

IAM 策略遵循最小特权原则,这意味着除非获得执行操作的权限,否则用户无法执行操作。有关更多信息,请参阅 IAM User Guide

基于用户的 IAM 策略中的 Amazon EMR 操作

在适用于 Amazon EMR 的 IAM 用户策略中,所有 Amazon EMR 操作的前缀都为小写 elasticmapreduce 元素。您可以使用通配符 (*) 指定 "elasticmapreduce:*" 密钥来指定所有与 Amazon EMR 相关的操作,也可以允许部分操作,例如 "elasticmapreduce:Describe*"。您还可以明确指定单个 Amazon EMR 操作,例如 "elasticmapreduce:DescribeCluster"。有关 Amazon EMR 操作的完整列表,请参阅 Amazon EMR API Reference中的 API 操作名称。由于 Amazon EMR 依赖其他服务 (例如 Amazon EC2 和 Amazon S3)。因此也需要向用户授予这些服务的部分权限。有关更多信息,请参阅 面向完全访问的 IAM 托管策略

注意

要访问 Amazon EMR 控制台,IAM 用户至少需要已附加允许以下操作的 IAM 策略:

elasticmapreduce:ListClusters

有关权限和策略的更多信息,请参阅 IAM User Guide 中的访问管理

Amazon EMR 不支持基于资源的策略和资源级别的策略,但您可以使用 Condition 元素 (也称作 Condition 块) 指定基于集群标签的精细访问控制。有关更多信息,请参阅 将集群标签与 IAM 策略结合使用来进行特定于集群的控制。由于 Amazon EMR 不支持基于资源的策略和资源级别的策略,因此 Resource 元素始终具有通配符值。

使用面向用户访问的托管策略

授予对所需 Amazon EMR 操作的完全访问权限或只读访问权限的最简单方式是使用适用于 Amazon EMR 的 IAM 托管策略。托管策略提供了在权限要求发生更改时自动更新的好处。如果您使用内联策略,则可能出现导致权限错误的服务更改。

这些策略不仅包括面向 Amazon EMR 的操作,还包括面向 Amazon EC2、Amazon S3 和 Amazon CloudWatch 的操作,Amazon EMR 使用这些策略执行启动实例、写入日志文件以及管理 Hadoop 作业和任务等操作。要创建自定义策略,建议您从托管策略开始,然后根据您的需求编辑这些策略。

有关如何将策略附加到 IAM 用户 (委托人) 的信息,请参阅 IAM User Guide 中的通过 AWS Management Console使用托管策略

面向完全访问的 IAM 托管策略

要为 Amazon EMR 授予对所有必需操作的权限,可附加 AmazonElasticMapReduceFullAccess 托管策略。下面显示了此策略声明的内容。它显示了 Amazon EMR 需要对其他服务执行的所有操作。

下面显示了此策略的版本 6 的内容。由于 AmazonElasticMapReduceFullAccess 策略将自动更新,因此此处显示的策略可能已过期。使用 AWS Management Console查看当前策略。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "cloudwatch:*", "cloudformation:CreateStack", "cloudformation:DescribeStackEvents", "ec2:AuthorizeSecurityGroupIngress", "ec2:AuthorizeSecurityGroupEgress", "ec2:CancelSpotInstanceRequests", "ec2:CreateRoute", "ec2:CreateSecurityGroup", "ec2:CreateTags", "ec2:DeleteRoute", "ec2:DeleteTags", "ec2:DeleteSecurityGroup", "ec2:DescribeAvailabilityZones", "ec2:DescribeAccountAttributes", "ec2:DescribeInstances", "ec2:DescribeKeyPairs", "ec2:DescribeRouteTables", "ec2:DescribeSecurityGroups", "ec2:DescribeSpotInstanceRequests", "ec2:DescribeSpotPriceHistory", "ec2:DescribeSubnets", "ec2:DescribeVpcAttribute", "ec2:DescribeVpcs", "ec2:DescribeRouteTables", "ec2:DescribeNetworkAcls", "ec2:CreateVpcEndpoint", "ec2:ModifyImageAttribute", "ec2:ModifyInstanceAttribute", "ec2:RequestSpotInstances", "ec2:RevokeSecurityGroupEgress", "ec2:RunInstances", "ec2:TerminateInstances", "elasticmapreduce:*", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:ListRoles", "iam:PassRole", "kms:List*", "s3:*", "sdb:*", "support:CreateCase", "support:DescribeServices", "support:DescribeSeverityLevels" ], "Effect": "Allow", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "*", "Condition": { "StringLike": { "iam:AWSServiceName": [ "elasticmapreduce.amazonaws.com", "elasticmapreduce.amazonaws.com.cn" ] } } } ] }

注意

ec2:TerminateInstances 操作可让 IAM 用户终止与 IAM 账户有关的任何 Amazon EC2 实例,即使它们不属于 EMR 集群的一部分。

面向只读访问的 IAM 托管策略

要向 Amazon EMR 授予只读权限,可附加 AmazonElasticMapReduceReadOnlyAccess 托管策略。下面显示了此策略声明的内容。elasticmapreduce 元素的通配符指定仅允许以指定字符串开头的操作。请记住,由于此策略不会明确拒绝操作,因此仍可使用其他策略声明来授予对指定操作的访问权限。

注意

由于 AmazonElasticMapReduceReadOnlyAccess 策略将自动更新,因此此处显示的策略可能已过期。使用 AWS Management Console查看当前策略。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticmapreduce:Describe*", "elasticmapreduce:List*", "elasticmapreduce:ViewEventsFromAllClustersInConsole" "s3:GetObject", "s3:ListAllMyBuckets", "s3:ListBucket", "sdb:Select", "cloudwatch:GetMetricStatistics" ], "Resource": "*" } ] }

使用内联策略设置用户权限

要自定义策略,建议您从托管策略开始,然后根据您的需求修改权限和条件。

重要

当服务要求发生变化时,内联策略不会自动更新。如果您创建并附加内联策略,请注意,服务更新可能会突然导致权限错误。有关更多信息,请参阅 IAM User Guide 中的托管策略与内联策略以及在创建集群时指定自定义 IAM 角色

AmazonElasticMapReduceFullAccess 是一个向用户授予对 Amazon EMR 的完全权限的默认托管策略,该策略包含一个允许所有资源的 iam:PassRole 权限的语句。此语句允许用户将任何角色传递给其他 AWS 服务,以便 Amazon EMR 可以代表该用户与这些服务进行交互。

要实现更严格的策略,请将内联策略附加到仅对特定于 Amazon EMR 的角色允许 iam:PassRole 的适当用户或组。以下示例演示了一个仅对默认 Amazon EMR 角色 EMR_DefaultRoleEMR_EC2_DefaultRoleEMR_AutoScalingDefaultRole 允许 iam:PassRole 权限的语句。如果您使用自定义角色,请用自定义角色名称替换默认角色名称。

{ "Action": "iam:PassRole", "Effect": "Allow", "Resource": [ "arn:aws:iam::*:role/EMR_DefaultRole", "arn:aws:iam::*:role/EMR_EC2_DefaultRole", "arn:aws:iam::*:role/EMR_AutoScaling_DefaultRole" ] }

有关 Amazon EMR 的角色的更多信息,请参阅为 IAM 角色配置对 AWS 服务的 Amazon EMR 权限

将集群标签与 IAM 策略结合使用来进行特定于集群的控制

您可以在 IAM 用户策略中将 Condition 元素 (也称作 Condition 块) 与以下 Amazon EMR 条件上下文密钥结合使用,基于集群标签控制访问权限:

  • 使用 elasticmapreduce:ResourceTag/TagKeyString 条件上下文密钥可允许或拒绝带特定标签的集群上的用户操作。

  • 使用 elasticmapreduce:RequestTag/TagKeyString 条件上下文密钥要求带操作/API 调用的特定标签。

重要

条件上下文密钥仅应用于将 ClusterID 作为请求参数接受的 Amazon EMR API 操作。

有关 Amazon EMR 操作的完整列表,请参阅 Amazon EMR API Reference中的 API 操作名称。有关 Condition 元素和条件运算符的更多信息,请参阅 IAM User Guide 中的 IAM 策略元素参考,尤其是字符串条件运算符。有关向 EMR 集群添加标签的更多信息,请参阅为 Amazon EMR 集群添加标签

示例 Amazon EMR 策略声明

以下示例说明了将条件运算符与 Amazon EMR 条件上下文密钥结合使用的不同场景和方法。这些 IAM 策略声明仅用于演示目的,并且不应用于生产环境。可通过多种方式来组合策略声明,以根据要求授予和拒绝权限。有关规划和测试 IAM 策略的更多信息,请参阅 IAM User Guide

仅允许带特定标签值的集群上的操作

以下示例演示了一个策略,该策略允许用户使用值 dev 根据集群标签 department 执行操作,并允许用户对集群添加相同的标签。最后一个策略示例演示如何拒绝向 EMR 集群添加除该相同标签之外的其他标签的权限。

重要

一个重要注意事项是,应该明确拒绝添加标签操作的权限。这将阻止用户通过您不打算授权的集群标签自行授予权限。如果最后一个示例中所示的操作未被拒绝,则用户可以在任何集群中添加和删除选定的标签并规避上述策略的意图。

在以下策略示例中,StringEquals 条件运算符尝试将 dev 与标签 department 的值匹配。如果标签 department 尚未添加到集群或不包含值 dev,则策略不会应用,并且此策略将不允许这些操作。如果任何其他策略声明允许操作,则用户只能使用标签中包含此值的集群。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt14793345241244", "Effect": "Allow", "Action": [ "elasticmapreduce:DescribeCluster", "elasticmapreduce:ListSteps", "elasticmapreduce:TerminateJobFlows ", "elasticmapreduce:SetTerminationProtection ", "elasticmapreduce:ListInstances", "elasticmapreduce:ListInstanceGroups", "elasticmapreduce:ListBootstrapActions", "elasticmapreduce:DescribeStep" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department": "dev" } } } ] }

您也可以使用条件运算符指定多个标签值。例如,要运行其 department 标签包含值 devtest 的集群上的所有操作,您可以将上一个示例中的条件块替换为以下内容。

"Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department":["dev", "test"] } }

在上一个示例中,以下示例策略将查找相同的匹配标签:department 标签的值 dev。但在本示例中,RequestTag 条件上下文密钥指定在标签创建期间应用策略,因此用户必须创建匹配指定值的标签。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1479334524000", "Effect": "Allow", "Action": [ "elasticmapreduce:RunJobFlow", "iam:PassRole" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "elasticmapreduce:RequestTag/department": "dev" } } } ] }

在以下示例中,允许添加和删除标签的 EMR 操作与指定前面实例中所示的 dev 标签的 StringNotEquals 运算符一起使用。此策略旨在拒绝用户在添加了 department 标签 (包含 dev 值) 的 EMR 集群中添加或删除任何标签的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "elasticmapreduce:AddTags", "elasticmapreduce:RemoveTags" ], "Condition": { "StringNotEquals": { "elasticmapreduce:ResourceTag/department": "dev" } }, "Resource": [ "*" ] } ] }

允许带有特定标签的集群上的操作,而不管标签值如何

您也可以仅允许具有特定标签的集群上的操作,而不管标签值如何。为此,您可以使用 Null 运算符。有关更多信息,请参阅 IAM User Guide 中的用于检查条件密钥是否存在的条件运算符。例如,要仅允许包含 department 标签的 EMR 集群上的操作 (而不管此标签包含的值如何)。您可以将上一示例中的条件块替换为以下内容。Null 运算符可检查 EMR 集群上是否存在标签 department。如果此标签存在,则 Null 语句的计算结果为 false,这匹配此策略声明中指定的条件并允许相应的操作。

"Condition": { "Null": { "elasticmapreduce:ResourceTag/department":"false" } }

以下策略声明仅允许用户在集群具有 department 标签 (可包含任何值) 的情况下创建 EMR 集群。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:RunJobFlow", "iam:PassRole" ], "Condition": { "Null": { "elasticmapreduce:RequestTag/department": "false" } }, "Effect": "Allow", "Resource": [ "*" ] } ] }

要求用户在创建集群时添加标签

以下策略声明仅允许用户在集群将具有 department 标签 (创建时包含值 dev) 的情况下创建 EMR 集群。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:RunJobFlow", "iam:PassRole" ], "Condition": { "StringEquals": { "elasticmapreduce:RequestTag/department": "dev" } }, "Effect": "Allow", "Resource": [ "*" ] } ] }