为何我的AWS SCP即便提供正确标签也禁止创建EC2实例?
AWS SCP 强制EC2实例标签配置问题排查
核心问题原因
- 资源范围配置错误
你在策略中将
Resource设为*,而ec2:RunInstances操作需要同时校验多种关联资源(AMI、子网、安全组、实例类型、密钥对等)的访问权限,这些非实例、非存储卷、非网络接口的资源访问请求中根本不会携带sc:environment标签,直接触发拒绝条件,导致整个实例创建请求被拦截。
- 条件操作符逻辑不符合预期
你使用的
ForAllValues:StringNotEquals要求请求中所有传入的标签键都必须等于sc:environment才不会触发拒绝,而实际创建场景中你可能会给实例添加多个自定义标签,或者AWS控制台会自动添加内置标签,只要存在任意一个非指定标签就会触发拒绝。
- 动作范围未做限制
你同时将
ec2:CreateTags加入拦截范围且未限定资源类型,创建实例过程中给EBS卷、ENI等附属资源打标签的请求,只要携带非指定标签也会被拦截,中断整个创建流程。
修正后的合规SCP参考
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireEnvironmentTagForNewEC2Instances", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringNotEquals": { "aws:RequestTag/sc:environment": ["prod", "test", "dev"] } } }, { "Sid": "PreventModificationOfRequiredEnvironmentTag", "Effect": "Deny", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": "sc:environment" } } } ] }
注:上述配置中
aws:RequestTag/sc:environment后的取值列表可替换为你实际允许的标签值。
修正说明
- 仅对EC2实例资源的创建请求做标签校验,不会影响AMI、子网等其他关联资源的正常权限校验
- 改用
aws:RequestTag直接校验请求中是否携带了sc:environment标签及合法值,允许同时添加其他自定义标签 - 第二条规则为可选配置,用于防止后续用户删除或修改实例上的强制标签,保障标签合规性
内容的提问来源于stack exchange,提问作者Appleoddity
相关产品推荐
相关产品推荐

