

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

# 对集群和 EMR Notebooks 进行基于标签的访问的 IAM policy
<a name="emr-fine-grained-cluster-access"></a>

您可以在基于身份的策略中使用条件，以便基于标签控制对集群和 EMR Notebooks 的访问。

有关向集群添加标签的更多信息，请参阅[为 EMR 集群添加标签](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-tags.html)。

以下示例说明将条件运算符与 Amazon EMR 条件键结合使用的不同场景和方法。这些 IAM policy 声明仅用于演示目的，并且不应用于生产环境。可通过多种方式来组合策略声明，以根据要求授予和拒绝权限。有关规划和测试 IAM policy 的更多信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)。

**重要**  
一个重要注意事项是，应该明确拒绝添加标签操作的权限。这可以防止用户标记资源，从而为其授予您不打算授予的权限。如果您未拒绝资源的标记操作，用户可以修改标签并规避基于标签的策略意图。

## 适用于集群的基于身份的策略语句示例
<a name="emr-cluster-access-resourcetag"></a>

以下示例演示基于身份的权限策略，用于控制允许对 EMR 集群执行的操作。

**重要**  
Amazon EMR 中的 `ModifyInstanceGroup` 操作不需要您指定集群 ID。因此，基于集群标签拒绝此操作需要额外的考虑。有关更多信息，请参阅[在 Amazon EMR 中拒绝该 ModifyInstanceGroup 操作](emr-cluster-deny-modifyinstancegroup.md)。

**Topics**
+ [仅允许带特定标签值的集群上的操作](#emr-cluster-access-example-tagvalue)
+ [创建集群时需要集群标签](#emr-cluster-access-example-require-tagging)
+ [允许带有特定标签的集群上的操作，而不管标签值如何](#emr-cluster-access-example-tag)

### 仅允许带特定标签值的集群上的操作
<a name="emr-cluster-access-example-tagvalue"></a>

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

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

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "Stmt12345678901234",
      "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` 标签包含值 `dev` 或 `test` 的集群上的所有操作，您可以将上一个示例中的条件块替换为以下内容。

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

### 创建集群时需要集群标签
<a name="emr-cluster-access-example-require-tagging"></a>

在前面的示例中，以下示例策略将查找相同的匹配标签：`department` 标签的值 `dev`。但在此示例中，`RequestTag` 条件键指定策略在标签创建期间适用。因此，您必须使用与指定值匹配的标签创建集群。

要创建带有标签的集群，您还必须具有 `elasticmapredue:AddTags` 操作权限。对于此语句，`elasticmapreduce:ResourceTag` 条件键确保 IAM 仅授予对标签 `department` 上具有值 `dev` 的标签资源的访问权限。`Resource` 元素用于将此权限限制到集群资源。

对于`PassRole`资源，您必须在语句中提供 AWS 账户 ID 或别名、服务角色名称以及`PassRoleForEMR`语`PassRoleForEC2`句中的实例配置文件名称。有关 IAM ARN 格式的更多信息，请参阅 [IAM 用户指南 ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)*中的 IAM*。

有关匹配的标签键值的更多信息，请参阅《IAM 用户指南》**中的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "RunJobFlowExplicitlyWithTag",
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:RunJobFlow"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/department": "dev"
        }
      }
    },
    {
      "Sid": "AddTagsForDevClusters",
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:AddTags"
      ],
      "Resource": [
        "arn:aws:elasticmapreduce:*:*:cluster/*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/department": "dev"
        }
      }
    },
    {
      "Sid": "PassRoleForEMR",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/Role-Name-With-Path"
      ],
      "Condition": {
        "StringLike": {
          "iam:PassedToService": "elasticmapreduce.amazonaws.com*"
        }
      }
    },
    {
      "Sid": "PassRoleForEC2",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/Role-Name-With-Path"
      ],
      "Condition": {
        "StringLike": {
          "iam:PassedToService": "ec2.amazonaws.com*"
        }
      }
    }
  ]
}
```

------

### 允许带有特定标签的集群上的操作，而不管标签值如何
<a name="emr-cluster-access-example-tag"></a>

您也可以仅允许具有特定标签的集群上的操作，而不管标签值如何。为此，您可以使用 `Null` 运算符。有关更多信息，请参阅《IAM 用户指南》**中的[用于检查条件键是否存在的条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Conditions_Null)。例如，要仅允许包含 `department` 标签的 EMR 集群上的操作 (而不管此标签包含的值如何)。您可以将上一示例中的条件块替换为以下内容。`Null` 运算符可检查 EMR 集群上是否存在标签 `department`。如果此标签存在，则 `Null` 语句的计算结果为 false，这匹配此策略声明中指定的条件并允许相应的操作。

```
1. "Condition": {
2.   "Null": {
3.     "elasticmapreduce:ResourceTag/department":"false"
4.   }
5. }
```

以下策略声明仅允许用户在集群具有 `department` 标签 (可包含任何值) 的情况下创建 EMR 集群。对于`PassRole`资源，您需要提供 AWS 账户 ID 或别名以及服务角色名称。有关 IAM ARN 格式的更多信息，请参阅 [IAM 用户指南 ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)*中的 IAM*。

有关指定 null (false) 条件运营的更多信息，请参阅《IAM 用户指南》**中的[用于检查条件键是否存在的条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CreateClusterTagNullCondition",
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:RunJobFlow"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "Null": {
          "aws:RequestTag/department": "false"
        }
      }
    },
    {
      "Sid": "AddTagsNullCondition",
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:AddTags"
      ],
      "Resource": [
        "arn:aws:elasticmapreduce:*:*:cluster/*"
      ],
      "Condition": {
        "Null": {
          "elasticmapreduce:ResourceTag/department": "false"
        }
      }
    },
    {
      "Sid": "PassRoleForElasticMapReduce",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/Role-Name-With-Path"
      ],
      "Condition": {
        "StringLike": {
          "iam:PassedToService": "elasticmapreduce.amazonaws.com*"
        }
      }
    },
    {
      "Sid": "PassRoleForEC2",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/Role-Name-With-Path"
      ],
      "Condition": {
        "StringLike": {
          "iam:PassedToService": "ec2.amazonaws.com*"
        }
      }
    }
  ]
}
```

------

## 适用于 EMR Notebooks 的基于身份的策略语句示例
<a name="emr-managed-notebooks-tags-examples"></a>

本部分中的示例 IAM policy 语句展示了使用密钥来限制使用 EMR Notebooks 所允许的操作的常见情形。只要与委托人（用户）关联的其它策略都不允许执行这些操作，条件上下文键就会按指示限制允许的操作。

**Example ：仅允许访问用户基于标记创建的 EMR Notebooks**  
下面的示例策略语句附加到角色或用户后，会允许用户仅使用他们创建的 Notebook。此策略语句使用创建 Notebook 时应用的默认标签。  
在示例中，`StringEquals` 条件运算符尝试将表示当前用户用户 ID (`{aws:userId}`) 的变量与标签 `creatorUserID` 的值相匹配。如果标签 `creatorUserID` 尚未添加到 Notebook 或不包含当前用户 ID 的值，则策略不会应用，并且此策略将不允许这些操作。如果没有任何其它策略语句允许这些操作，则用户只能使用此标签中包含此值的 Notebook。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:DescribeEditor",
        "elasticmapreduce:StartEditor",
        "elasticmapreduce:StopEditor",
        "elasticmapreduce:DeleteEditor",
        "elasticmapreduce:OpenEditorInConsole"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/creatorUserId": "${aws:userId}"
        }
      },
      "Sid": "AllowELASTICMAPREDUCEDescribeeditor"
    }
  ]
}
```

**Example ：创建 Notebook 时需要 Notebook 标记**  
此示例使用 `RequestTag` 上下文键。仅当用户未更改或删除 `creatorUserID` 标签时，才允许执行 `CreateEditor` 操作，此标签是默认添加的。变量 \$1\$1aws:userId\$1 用于指定当前活动用户的用户 ID，此 ID 是标签的默认值。  
该策略语句可有助于确保用户不会删除 `createUserId` 标签或更改其值。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:CreateEditor"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:RequestTag/creatorUserId": "${aws:userid}"
        }
      },
      "Sid": "AllowELASTICMAPREDUCECreateeditor"
    }
  ]
}
```
此示例要求用户使用键字符串为 `dept` 且值设置为以下之一的标签创建集群：`datascience`、`analytics`、`operations`。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:CreateEditor"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:RequestTag/dept": [
            "datascience",
            "analytics",
            "operations"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCECreateeditor"
    }
  ]
}
```

**Example ：将 Notebook 创建限定到已标记的集群并需要 Notebook 标签**  
仅当使用键字符串 `owner` 设置为一个指定值的标签创建 Notebook 时，此示例才允许创建 Notebook。此外，仅当集群具有键字符串 `department` 设置为一个指定值的标签时，才能创建 Notebook。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:CreateEditor"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:RequestTag/owner": [
            "owner1",
            "owner2",
            "owner3"
          ],
          "elasticmapreduce:ResourceTag/department": [
            "dep1",
            "dep3"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCECreateeditor"
    }
  ]
}
```

**Example ：将能力限定为启动基于标签的 Notebook**  
此示例将启动 Notebook 的能力限定为那些具有键字符串 `owner` 设置为一个指定值的标签的 Notebook。因为 `Resource` 元素仅用于指定 `editor`，所以此条件不适用于集群，并且它不需要标记。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:StartEditor"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:editor/*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/owner": [
            "owner1",
            "owner2"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEStarteditor"
    }
  ]
}
```
此示例类似于上一示例。但是，限制仅适用于已标记的集群，不适用于 Notebook。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:StartEditor"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:cluster/*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/department": [
            "dep1",
            "dep3"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEStarteditor"
    }
  ]
}
```
此示例使用一组不同的 Notebook 和集群标签。仅当满足以下条件时，它才允许启动 Notebook：  
+ Notebook 具有键字符串 `owner` 设置为任意指定值的标签

  和
+ 集群具有键字符串 `department` 设置为任意指定值的标签  
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:StartEditor"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:editor/*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/owner": [
            "user1",
            "user2"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEStarteditorByOwner"
    },
    {
      "Action": [
        "elasticmapreduce:StartEditor"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:cluster/*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/department": [
            "datascience",
            "analytics"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEStarteditorByDepartment"
    }
  ]
}
```

**Example ：将能力限定为打开基于标签的 Notebook 编辑器**  
仅当满足以下条件时，此示例才允许打开 Notebook 编辑器：  
+ Notebook 具有键字符串 `owner` 设置为任意指定值的标签。

  和
+ 集群具有键字符串 `department` 设置为任意指定值的标签。  
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:OpenEditorInConsole"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:editor/*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/owner": [
            "user1",
            "user2"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEOpeneditorconsoleByOwner"
    },
    {
      "Action": [
        "elasticmapreduce:OpenEditorInConsole"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:cluster/*"
      ],
      "Condition": {
        "StringEquals": {
          "elasticmapreduce:ResourceTag/department": [
            "datascience",
            "analytics"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEOpeneditorconsoleByDepartment"
    }
  ]
}
```