拒绝 Amazon EMR 中的 ModifyInstanceGroup 操作 - Amazon EMR
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" } ] }