本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon EMR 中拒绝该 ModifyInstanceGroup 操作
Amazon EMR 中的ModifyInstanceGroups操作不需要您在操作中提供集群 ID。相反,您只能指定实例组 ID。因此,基于集群 ID 或集群标签的简单拒绝策略可能不会产生预期效果。考虑以下示例策略。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Effect": "Allow", "Resource": "*" }, { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Effect": "Deny", "Resource": "arn:aws:elasticmapreduce:us-east-1:123456789012:cluster/j-12345ABCDEFG67" } ] }
如果附加了此策略的用户执行 ModifyInstanceGroup
操作并仅指定实例组 ID,则该策略不适用。由于允许在所有其它资源上执行该操作,因此操作成功。
解决此问题的方法是在身份上附加策略声明,该声明使用NotResource元素来拒绝在没有集群 ID 的情况下ModifyInstanceGroup
执行的任何操作。以下示例策略添加了这样的拒绝语句,因此除非指定了集群 ID,否则任何 ModifyInstanceGroups
请求都会失败。由于身份必须在操作中指定集群 ID,因此基于集群 ID 的拒绝语句是有效的。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Effect": "Allow", "Resource": "*" }, { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Effect": "Deny", "Resource": "arn:aws:elasticmapreduce:us-east-1:123456789012:cluster/j-12345ABCDEFG67" }, { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Effect": "Deny", "NotResource": "arn:*:elasticmapreduce:*:*:cluster/*" } ] }
当您希望根据集群标签关联的值拒绝 ModifyInstanceGroups
操作时,也会出现类似问题。解决方案与之相似。除了添加指定标签值的拒绝语句之外,您还可以添加一个策略语句,在您指定的标签不存在时拒绝该 ModifyInstanceGroup
操作,无论值如何。
以下示例演示了一个策略,该策略在附加到身份时,会拒绝执行任何标签设置 department
设置为 dev
的集群上的任何 ModifyInstanceGroups
操作。这个语句之所以有效,是因为拒绝语句使用 StringNotLike
条件来拒绝操作,除非存在 department
标签。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Effect": "Allow", "Resource": "*" }, { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Condition": { "StringEquals": { "aws:ResourceTag/department": "dev" } }, "Effect": "Deny", "Resource": "*" }, { "Action": [ "elasticmapreduce:ModifyInstanceGroups" ], "Condition": { "StringNotLike": { "aws:ResourceTag/department": "?*" } }, "Effect": "Deny", "Resource": "*" } ], }