You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform list(object)类型变量用optional修饰报错解决方案

报错根因

optional 关键字的作用范围有严格限制:仅能用于修饰object类型定义内的单个属性,不能直接包裹整个顶层变量的类型声明,这也是报错信息明确指出的语法规则。
你之前的用法是把整个list(object({...}))类型包裹在optional()里,本身不符合语法设计,和是否开启实验特性没有关系。另外你对Terraform顶层变量的可选逻辑存在认知偏差:module_variable_optional_attrs实验特性的设计目标是支持object类型内部字段的可选配置,从来不是用来标记整个顶层变量为可选的。

需求实现方案

你需要的「未传入urlMaps参数时变量默认返回null」的效果,不需要开启任何实验特性,直接通过Terraform变量原生的default参数就能实现,正确配置如下:

variable "urlMaps" {
  description = "Network endpoint group url map configuration"
  type        = list(object({
    hosts     = list(string)
    paths     = list(string)
    service   = string
  }))
  # 未传参时默认返回null
  default     = null
}

该配置的实际效果完全匹配需求:

  • 传入urlMaps参数时,会严格按照定义的list(object)结构做类型校验,你现有terraform.tfvars里的配置不需要任何修改即可正常使用
  • 未通过tfvars、环境变量、命令行参数等任何渠道传入urlMaps时,变量值默认为null
补充:optional关键字的正确使用场景

如果你需要实现「object结构内部的某个属性可选」(比如允许urlMaps列表里的单条规则不传paths字段),这时候才需要用到optional关键字:

  • Terraform 1.3以前的版本,需要先在settings块开启module_variable_optional_attrs实验特性
  • Terraform 1.3及以后版本,object可选属性功能已经正式发布,不需要开启实验开关即可直接使用
    正确写法示例:
variable "urlMaps" {
  type = list(object({
    hosts     = list(string)
    # paths字段可选,未传时默认值为空列表
    paths     = optional(list(string), [])
    service   = string
  }))
  default = null
}

内容的提问来源于stack exchange,提问作者Abhishek Solanki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:39:14