TLDR;将变量插入到引用中以迭代数据中的值:
some key
val := input.resource.aws_vpc.tags[key]
contains(key, "Application")
当您将变量插入到引用中时,OPA/Rego 会找到对那些满足规则中表达式的变量的所有赋值。例如,如果规则很简单:
check {
some key
input.resource.aws_vpc.tags[key]
}
check
如果input.resource.aws_vpc_tags
包含至少一个值(不是false
),则为真。有关迭代的更多信息,请参阅Rego 介绍文档中的此部分。在您的情况下,您想测试是否包含任何键"Application"
,因此您只需在规则中添加一条附加语句:
check {
some key
input.resource.aws_vpc.tags[key]
contains(key, "Application")
}
check
如果至少有一个值具有包含字符串的键,则现在为真"Application"
。如果您只需要一个简单的布尔检查,那么这将起作用。在某些情况下,您可能需要包含"Application"
. 在这些情况下,您可以使用Set Comprehension:
vals := {val |
some key
val := input.resource.aws_vpc.tags[key]
contains(key, "Application")
}
如果您根据测试输入评估后者,则输出将是:
["Test"]
从技术上讲,输出将是一个集合,但由于 JSON 不支持集合,OPA 将它们呈现为外部调用者的数组。
这是游乐场中的相同示例(输入略有不同):https ://play.openpolicyagent.org/p/KfbrwYDxIJ 。
如果您正在寻找有关如何使用 OPA/Rego 的更多示例和教程,请查看此在线课程(披露:我为 Styra 工作)。