Terraform 1.9.8:引用另一个变量时变量验证条件始终评估为 True

问题描述 投票:0回答:1

我正在为我正在创建的 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": [
    ...
  ]
}
terraform
1个回答
0
投票

向 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'."
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.