0

假设我有以下测试输入,我希望能够编写一个测试来检查字符串Application是否包含在任何标签键中。这个想法是这个检查将能够跨资源匹配具有不同命名约定的标签。

知道如何做到这一点吗?

{
    "resource": {
        "aws_vpc": {
            "_type": "AWS.EC2.Vpc",
            "cidr_block": "10.0.0.0/16",
            "id": "vpc-abc123",
            "tags": {
                "MyApplication": "Test",
                "Application": "Test",
                "Name": "my-vpc"
            }
        }
    }
}
4

1 回答 1

1

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 工作)。

于 2021-08-09T23:23:33.450 回答