Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 
      中国的 Amazon Web Services 服务入门
         (PDF)。
    本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon EMR 中拒绝该 ModifyInstanceGroup 操作
Amazon EMR 中的ModifyInstanceGroups操作不需要您在操作中提供集群 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元素来拒绝在没有集群 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"
    }
  ]
}