Terraform 1.15.0 init 拒绝锁定的预发布 provider,检查状态阶段约束
Terraform 1.15.0 的 init 状态阶段可能丢失配置中的精确预发布 provider 约束;1.15.1 包含合并约束的修复,验证时应保持配置和锁文件不变。
配置已经精确指定一个带预发布后缀的 provider,锁文件也记录了相同版本,Terraform 1.15.0 的 init 却仍拒绝选择它。若前面的 provider 安装阶段正常,后面处理状态中的 provider 时失败,应检查两阶段使用的版本约束是否一致。
Terraform 对预发布版本的选择有明确约束:需要配置显式允许该版本,不能仅凭锁文件就把任意预发布版本纳入候选。问题出在 1.15.0 的分阶段初始化路径:状态提供的 provider requirements 不携带配置里的版本约束,第二阶段因此可能丢失精确预发布约束。
正式 1.15.1 将配置中的 provider requirements 合并进状态阶段的要求,保留这项选择信息。这个修复不改变 provider 发布渠道,也不能解决注册表不存在该版本、下载受限或锁文件校验不一致。
先检查实际配置与锁文件。下面只是声明结构示意,source 和版本必须换成组织实际发布、能够访问的 provider,不要照抄虚构版本安装:
terraform {
required_providers {
example = {
source = "your-namespace/your-provider"
version = "= 1.2.3-rc.1"
}
}
}
确认 .terraform.lock.hcl 中对应地址与精确版本一致,并区分 public registry、私有 registry、镜像和开发覆盖的实际来源。若配置只有宽泛范围约束,不能把此例当作“锁定预发布版必然可选”的依据。
把工作目录置于受控副本,使用包含修复的 Terraform 版本,在已有授权的初始化环境里重新执行:
terraform version
terraform init -lockfile=readonly
readonly 用于检查既有锁定能否被正确使用,不会替你补齐缺失或错误的锁记录。初始化仍可能连接后端和下载 provider,应按原项目的网络、后端和凭据流程执行。不要以删除锁文件、修改状态或加 -upgrade 的方式掩盖两阶段选择不一致。
验收时同时核对初始化结果和实际选择的 provider 版本,比较升级前后锁文件是否变化。所期待的是保留原约束和锁定后初始化成功,而不是通过放宽约束换用了另一版 provider。初始化通过也不等于 plan 或 apply 的业务结果已经正确;后续仍按项目原有评审执行。
这里涉及的是状态阶段丢失配置约束,适用范围与普通版本不存在、模块版本后缀排序或插件缓存错误不同。1.15.1 是已确认包含修复的版本,部署时可选择同样包含该修复且符合维护要求的后续版本。


