

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

# 在 Amazon EMR 中拒绝该 ModifyInstanceGroup 操作
<a name="emr-cluster-deny-modifyinstancegroup"></a>

Amazon EMR 中的[ModifyInstanceGroups](https://docs.aws.amazon.com/emr/latest/APIReference/API_ModifyInstanceGroups.html)操作不需要您在操作中提供集群 ID。相反，您只能指定实例组 ID。因此，基于集群 ID 或集群标签的简单拒绝策略可能不会产生预期效果。考虑以下示例策略。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Sid": "AllowELASTICMAPREDUCEModifyinstancegroups"
    },
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Effect": "Deny",
      "Resource": [
        "arn:aws:elasticmapreduce:us-east-1:123456789012:cluster/j-12345ABCDEFG67"
      ],
      "Sid": "DenyELASTICMAPREDUCEModifyinstancegroups"
    }
  ]
}
```

------

如果附加了此策略的用户执行 `ModifyInstanceGroup` 操作并仅指定实例组 ID，则该策略不适用。由于允许在所有其它资源上执行该操作，因此操作成功。

此问题的解决方案是在身份上附加策略声明，该声明使用[NotResource](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html)元素来拒绝在没有集群 ID 的情况下`ModifyInstanceGroup`执行的任何操作。以下示例策略添加了这样的拒绝语句，因此除非指定了集群 ID，否则任何 `ModifyInstanceGroups` 请求都会失败。由于身份必须在操作中指定集群 ID，因此基于集群 ID 的拒绝语句是有效的。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Sid": "AllowELASTICMAPREDUCEModifyinstancegroups"
    },
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Effect": "Deny",
      "Resource": [
        "arn:aws:elasticmapreduce:us-east-1:123456789012:cluster/j-12345ABCDEFG67"
      ],
      "Sid": "DenyELASTICMAPREDUCEModifyinstancegroupsSpecificCluster"
    },
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Effect": "Deny",
      "NotResource": "arn:*:elasticmapreduce:*:*:cluster/*",
      "Sid": "DenyELASTICMAPREDUCEModifyinstancegroupsNonCluster"
    }
  ]
}
```

------

当您希望根据集群标签关联的值拒绝 `ModifyInstanceGroups` 操作时，也会出现类似问题。解决方案与之相似。除了添加指定标签值的拒绝语句之外，您还可以添加一个策略语句，在您指定的标签不存在时拒绝该 `ModifyInstanceGroup` 操作，无论值如何。

以下示例演示了一个策略，该策略在附加到身份时，会拒绝执行任何标签设置 `department` 设置为 `dev` 的集群上的任何 `ModifyInstanceGroups` 操作。这个语句之所以有效，是因为拒绝语句使用 `StringNotLike` 条件来拒绝操作，除非存在 `department` 标签。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ],
      "Sid": "AllowELASTICMAPREDUCEModifyinstancegroups"
    },
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/department": "dev"
        }
      },
      "Effect": "Deny",
      "Resource": [
        "*"
      ],
      "Sid": "DenyELASTICMAPREDUCEModifyinstancegroupsDevDepartment"
    },
    {
      "Action": [
        "elasticmapreduce:ModifyInstanceGroups"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:ResourceTag/department": "?*"
        }
      },
      "Effect": "Deny",
      "Resource": [
        "*"
      ],
      "Sid": "DenyELASTICMAPREDUCEModifyinstancegroupsNoDepartmentTag"
    }
  ]
}
```

------