DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Terraform 1.15.0 init 报未初始化变量,检查跨变量 validation

Terraform 1.15.0 在 init 阶段处理跨变量 validation 时可能报未初始化变量;1.15.1 为非 const 变量保留未知值,并继续在后续阶段执行真实校验。

Terraform 1.15.0 的 init 还没进入计划阶段,就因为变量校验引用了另一个变量而报“未初始化变量”。这种错误在 Windows amd64 环境的跨变量 validation 配置中出现过。先看报错发生的阶段和被引用变量,避免把它误当作用户已经传入了不合法值。

初始化期间,有些变量还没有写入 NamedValues。1.15.0 的相关求值路径却试图读取这些未准备的非 const 变量,导致初始化失败。正式 1.15.1 对 walkInit 中非 const 变量返回带类型信息的未知值,让初始化不必提前求出它;后续有真实输入的阶段仍应执行变量校验。

跨变量规则本身可以表达合理业务约束。下面仅用于说明这种依赖关系,不代表任何云资源配置:

variable "mode" {
  type = string
}

variable "name" {
  type = string
  validation {
    condition     = var.mode != "strict" || length(var.name) > 0
    error_message = "strict mode requires a nonempty name."
  }
}

若同一配置在初始化阶段就试图读出 mode,可将它与实际错误中的引用位置对照。这个修复针对尚未初始化的非 const 变量,不表示所有 const 声明、变量依赖环或表达式错误都应被当作未知值放行。

保留原有校验规则,升级到含修复的维护版本后,在受控副本中先运行:

terraform version
terraform init -backend=false
terraform validate

禁用后端的初始化适合检查这类阶段性错误,仍可能涉及模块或 provider 安装。命令成功后,还要在项目既有的计划流程里确认变量规则没有失效。对于这个纯变量示例,可以用已知有效值与无效值分别检查计划:

terraform plan -input=false -var='mode=strict' -var='name=example'
terraform plan -input=false -var='mode=strict' -var='name='

期望有效值通过、无效值仍被 error_message 拦截。在真实项目中,plan 可能访问外部服务,应使用原有授权环境与测试变量,不把这两条示例命令直接移到生产配置。

验收包括两个结果:初始化不再过早读取变量,后续真实输入依然受约束。删除 validation、把所有规则改成恒真,或随意给变量添加默认值,都可能掩盖故障同时改变业务合同。若升级后错误来自类型不匹配或循环引用,仍应单独修正配置。