我可以循环遍历 OPA 中对象的键和值以验证它们是否遵循某种格式 (CamelCase)
Can I loop over keys and values of an object in OPA to validate if they adhere to a certain format (CamelCase)
我们正在使用 conftest 来验证我们的 Terraform 变更集是否适用于某些规则和合规性。我们要验证的一件事是我们的 AWS 资源是否根据 AWS 标记约定进行标记,该约定指定要使用的某些标签(例如所有者、ApplicationRole、项目)并指定所有标签和值都在 CamelCase 中。
在 terraform 中,变更集描述为以下(简化)json 输出:
{
"resource_changes":{
"provider_name":"aws",
"change":{
"before":{
},
"after":{
"tags":{
"ApplicationRole":"SomeValue",
"Owner":"SomeValue",
"Project":"SomeValue"
}
}
}
}
}
我现在要做的是验证以下内容:
- 检查是否设置了标签。
- 验证键和值是否都是驼峰式。
- 检查键是否至少包含集合(ApplicationRole、Owner、Project)。
但是,我在 Rego 中定义它时遇到问题(我对 OPA 很陌生)。
有没有办法 "loop" 遍历对象的键和值,并验证它们的格式是否正确?
在伪代码中:
for key, value in tags {
re_match(`([A-Z][a-z0-9]+)+`, key)
re_match(`([A-Z][a-z0-9]+)+`, value)
}
我试过以下方法:
tags_camel_case(tags) {
some key
val := tags[key]
re_match(`^([A-Z][a-z0-9]+)+`, key) # why is key not evaluated?
re_match(`^([A-Z][a-z0-9]+)+`, val)
}
但是,在针对以下测试进行评估时 json:
{
"AppRole": "SomeValue",
"appRole": "SomeValue"
}
规则 returns 正确,即使我正在检查键和值与正则表达式
tags_camel_case(tags)
函数 returns 对于具有两个键的输入为真,因为(默认情况下)Rego 中的变量是存在量化的。这意味着如果 对于某些 组变量绑定,规则主体满足,规则主体中的语句为真。在上面的示例中,规则主体将满足 {key=AppRole, val=SomeValue}
.
要为所有 表达 ,您可以使用一个简单的技巧。首先编写一个规则来检查是否有任何标签不是驼峰大小写。第二写规则,检查是否不满足第一条规则。
例如:
# checks if all tags are camel case
tags_camel_case(tags) {
not any_tags_not_camel_case(tags)
}
# checks if any tags are NOT camel case
any_tags_not_camel_case(tags) {
some key
val := tags[key]
not is_camel_case(key, val)
}
# checks if a and b are both camel case
is_camel_case(a, b) {
re_match(`^([A-Z][a-z0-9]+)+`, a)
re_match(`^([A-Z][a-z0-9]+)+`, b)
}
有关 Rego 中表达式 'for all' 的更多信息,请参阅 https://www.openpolicyagent.org/docs/latest/how-do-i-write-policies/#universal-quantification-for-all
我们正在使用 conftest 来验证我们的 Terraform 变更集是否适用于某些规则和合规性。我们要验证的一件事是我们的 AWS 资源是否根据 AWS 标记约定进行标记,该约定指定要使用的某些标签(例如所有者、ApplicationRole、项目)并指定所有标签和值都在 CamelCase 中。
在 terraform 中,变更集描述为以下(简化)json 输出:
{
"resource_changes":{
"provider_name":"aws",
"change":{
"before":{
},
"after":{
"tags":{
"ApplicationRole":"SomeValue",
"Owner":"SomeValue",
"Project":"SomeValue"
}
}
}
}
}
我现在要做的是验证以下内容:
- 检查是否设置了标签。
- 验证键和值是否都是驼峰式。
- 检查键是否至少包含集合(ApplicationRole、Owner、Project)。
但是,我在 Rego 中定义它时遇到问题(我对 OPA 很陌生)。
有没有办法 "loop" 遍历对象的键和值,并验证它们的格式是否正确?
在伪代码中:
for key, value in tags {
re_match(`([A-Z][a-z0-9]+)+`, key)
re_match(`([A-Z][a-z0-9]+)+`, value)
}
我试过以下方法:
tags_camel_case(tags) {
some key
val := tags[key]
re_match(`^([A-Z][a-z0-9]+)+`, key) # why is key not evaluated?
re_match(`^([A-Z][a-z0-9]+)+`, val)
}
但是,在针对以下测试进行评估时 json:
{
"AppRole": "SomeValue",
"appRole": "SomeValue"
}
规则 returns 正确,即使我正在检查键和值与正则表达式
tags_camel_case(tags)
函数 returns 对于具有两个键的输入为真,因为(默认情况下)Rego 中的变量是存在量化的。这意味着如果 对于某些 组变量绑定,规则主体满足,规则主体中的语句为真。在上面的示例中,规则主体将满足 {key=AppRole, val=SomeValue}
.
要为所有 表达 ,您可以使用一个简单的技巧。首先编写一个规则来检查是否有任何标签不是驼峰大小写。第二写规则,检查是否不满足第一条规则。
例如:
# checks if all tags are camel case
tags_camel_case(tags) {
not any_tags_not_camel_case(tags)
}
# checks if any tags are NOT camel case
any_tags_not_camel_case(tags) {
some key
val := tags[key]
not is_camel_case(key, val)
}
# checks if a and b are both camel case
is_camel_case(a, b) {
re_match(`^([A-Z][a-z0-9]+)+`, a)
re_match(`^([A-Z][a-z0-9]+)+`, b)
}
有关 Rego 中表达式 'for all' 的更多信息,请参阅 https://www.openpolicyagent.org/docs/latest/how-do-i-write-policies/#universal-quantification-for-all