我正在为我正在创建的 Terraform 模块的 Kafka 主题架构设置变量验证。
模式可以是以下两种类型之一:AVRO 或 JSON。由于两种架构类型都是在 .json 文件中定义的,因此我使用名为
scheama_format
的变量来确定传入架构的类型。架构本身由一个名为 schema_path
的变量提供,指向 .json 文件。
在评估
schema_path
给出的文件是否有效时,我必须知道它是什么类型的文件才能知道我必须检查哪些键。我尝试了很多变体,但我当前的验证条件如下所示:
variable "schema_path" {
type = string
description = "Relative path to the schema file to upload to the Schema Registry."
...
###################
# THIS IS THE VALIDATION THAT IS NOT WORKING
###################
validation {
conditions = (var.schema_format != "AVRO") || (jsondecode(file(var.schema_path)).type == "record")
error_message = "If schema_format is 'AVRO', the schema file must have a type of 'record'."
}
}
variable "schema_type" {
type = string
description = "The type of schema. Must be either 'JSON' or 'AVRO'."
...
}
无论我做什么,每当验证条件包含不同变量的值时,该条件都会评估为 true(因此验证永远不会触发错误)。
这是 Terraform 中的错误,还是我在这里遗漏了什么?
我已经使用不同的变量尝试了详尽的条件,它们都评估为 true。
即使是简单的条件,例如:
variable "schema_path" {
...
validation {
conditions = (length(var.schema_format) < 0) || (length(var.schema_path) < 0)
error_message = "TEST"
}
}
variable "schema_type" {
...
}
在我看来,无论如何,这个条件都应该评估为假,但它评估为真。
如果我尝试:
variable "schema_path" {
...
validation {
conditions = false || (length(var.schema_path) < 0)
error_message = "TEST"
}
}
variable "schema_type" {
...
}
条件评估为假,但一旦我使用不同的变量作为条件的一部分,它评估为真。
如果这是预期的行为,我不明白 Terraform 版本 1.9.0 允许使用不同变量作为变量验证的一部分的意义。我错过了什么?
对于上下文,这是架构文件的通用版本:
{
"type": "record",
"namespace": "com.mycorp.mynamespace",
"name": "sampleRecord",
"doc": "Sample schema to help you get started.",
"fields": [
...
]
}
向 schema_type 变量添加验证块,然后使用 check 块 根据 json 文件验证变量:
variable "schema_path" {
type = string
description = "Relative path to the schema file to upload to the Schema Registry."
}
variable "schema_type" {
type = string
validation {
condition = contains(["AVRO", "JSON"], var.schema_type)
error_message = "The type of schema. Must be either 'JSON' or 'AVRO'."
}
}
check "validate_schema" {
assert {
condition = var.schema_type == "AVRO" && (jsondecode(file(var.schema_path)).type == "record")
error_message = "If schema_format is 'AVRO', the schema file must have a type of 'record'."
}
}