AWS刚刚发布了针对EC2 / EBS的必需标记支持: New – Tag EC2 Instances & EBS Volumes on Creation
但是,给出的示例仅检查标签是否具有对我们无用的固定值,因为我们的用户可以为所需标签输入自由格式值。如何编写策略来检查标签?
例如,我们需要这样的东西:
"Statement": [
{
"Sid": "DenyMissingTags",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
"Condition": {
"StringExists": [
"aws:RequestTag/costcenter",
"aws:RequestTag/stack",
]
}
}
]
显然,我编造了StringExists
答案 0 :(得分:2)
AWS支持提供了我确认可以使用的解决方案。需要两个单独的条件块,以确保仅存在1个标记时拒绝操作:
{
"Sid": "AllowLaunchOnlyWithRequiredTags1",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
"Condition": {
"Null": {"aws:RequestTag/costcenter": "true"}
}
},
{
"Sid": "AllowLaunchOnlyWithRequiredTags2",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
"Condition": {
"Null": {"aws:RequestTag/stack": "true"}
}
}
答案 1 :(得分:1)
该页面实际上将标记强制列为:
"Condition": {
"StringEquals": {
"aws:RequestTag/costcenter": "115",
"aws:RequestTag/stack": "prod"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": ["costcenter","stack"]
}
}
documentation for ForAllValues
说:
ForAllValues 限定符要求所有请求的值都列在政策中
因此,该部分可能会强制执行标记,而不强制执行实际内容。
答案 2 :(得分:0)
您可以使用StringLike
或StringNotLike
执行某些操作,但如果适用于您,则仅限于通配符。
StringLike - 区分大小写的匹配。这些值可以在字符串中的任何位置包含多字符匹配通配符(*)或单字符匹配通配符(?)。
示例:
"Statement": [
{
"Sid": "DenyMissingTags",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
"Condition": {
"StringLike": [
"aws:RequestTag/costcenter": "*",
"aws:RequestTag/stack": "*"
]
}
}
]
我没有对它进行过测试,但它应该有效。