关键字"optional"不是有效的类型构造函数'在terraform版本">



在当前的地形管道中,我将主题作为列表传递

locals {
test_topics = [
{
name                      = "topic1"
is_public                 = true
version                   = 1
is_cleanup_policy_compact = true
max_message_bytes         = "-1"
partition_count = 3
},
{
name                      = "topic2"
is_public                 = true
version                   = 1
is_cleanup_policy_compact = true
max_message_bytes         = "-1"
partition_count = 4
},
{
name                      = "topic3"
is_public                 = true
version                   = 1
is_cleanup_policy_compact = true
max_message_bytes         = "-1"
partition_count = 5     
},
{
name                      = "topic4"
is_public                 = true
version                   = 1
is_cleanup_policy_compact = true
max_message_bytes         = "-1"
},
{
name                      = "topic5"
is_public                 = true
version                   = 1
is_cleanup_policy_compact = true
max_message_bytes         = "-1"
partition_count = 5
}
]
}
# example create topic it automatically assigns READ WRITE access to the service account and READ access to all PUBLIC topics
module "test_topics" {
source = "../kafka_topic"
topics = "${local.test_topics}"
environment     = var.environment
data_domain     = var.data_domain
service_account = var.service_account
}

和在子模块中声明变量,如下

variable "topics" {
type        = list(object({
name = string
is_public = bool
is_cleanup_policy_compact = bool
version = number
max_message_bytes = number
partition_count = number
}))
description = "list of topics with their configuration"
default = null
}

和子main。如果我们使用以下代码

创建主题
resource "kafka_topic" "topic" {
count              = length(var.topics)
name               = "${lookup(var.topics[count.index], "is_public") ? "public" :"private"}_${var.environment}_${var.data_domain}_${lookup(var.topics[count.index], "name")}_${lookup(var.topics[count.index], "version")}"
partitions         = lookup(var.topics[count.index], "partition_count") == null ? 6 : "${lookup(var.topics[count.index], "partition_count")}"
replication_factor = 3
config = {
"cleanup.policy" = lookup(var.topics[count.index], "is_cleanup_policy_compact") ? "compact" : "delete"
"max.message.bytes" =  lookup(var.topics[count.index], "max_message_bytes") != -1 ? "${lookup(var.topics[count.index], "max_message_bytes")}" : 1000012
}
}

但当运行地形计划时,我得到以下异常

属性"partition_count"是必需的。

注意:我在variable中声明变量时也使用了partition_count = optional(number)。Tf(将该属性保留为可选字段),但得到以下错误

关键字"optional"不是有效的类型构造函数

可能是由于我目前使用的地形版本是">= 0.12"但当我尝试使用">= 0.15"版本,得到相同的错误'Keyword "optional"不是有效的类型构造函数错误。有什么办法可以解决这个问题吗?

尝试添加:

terraform {
experiments = [module_variable_optional_attrs]
}