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、把所有规则改成恒真,或随意给变量添加默认值,都可能掩盖故障同时改变业务合同。若升级后错误来自类型不匹配或循环引用,仍应单独修正配置。


