Terraform Provider不一致最终计划报错 未知值致rrdatas异常
问题根因
该报错是HashiCorp Google provider 4.24~4.39版本区间存在的已知逻辑缺陷:google_dns_record_set资源的rrdatas字段在plan阶段解析列表值时,如果列表内存在需要apply后才可确定的未知值,且该未知值来自多层依赖传递(比如先通过local转义、再跨资源引用),provider会错误丢弃整个rrdatas字段的返回结果,既不保留已知的列表元素,也不对未知值做(known after apply)标记。后续apply阶段资源实际生成的rrdatas属性和plan阶段存储的预期值不一致,就会触发inconsistent final plan的一致性校验报错。
解决方案
按优先级从高到低可选以下方案:
- 升级Google provider版本
将Terraform配置中google provider的版本约束修改为>= 4.40.0,该版本已正式修复DNS记录集字段对未知值的解析bug。修改后执行terraform init -upgrade更新provider二进制,重新执行plan即可看到rrdatas字段正常展示,未知值会被正确标记,不会再触发一致性报错。 - 调整依赖引用方式(无法升级provider时使用)
不要通过local中转引用随机项目ID,直接在rrdatas字段中引用random_id资源的属性值,避开多层依赖传递触发的字段解析bug,调整后的资源配置示例:resource "google_dns_record_set" "cdn_dns_txt_record_firebase" { name = "www.bob.com" project = google_project.my_project.project_id managed_zone = "bob.com." type = "TXT" ttl = 300 rrdatas = [ "\"v=spf1 include:_spf.firebasemail.com ~all\"", "firebase=${random_id.project_id.hex}" ] } - 分阶段执行apply
先执行定向apply创建前置依赖资源,等project_id成为已知值后再执行全量部署:- 执行
terraform apply -target=random_id.project_id -target=google_project.my_project,确认项目相关资源创建完成 - 执行常规
terraform apply完成剩余DNS记录资源的创建,此时plan阶段rrdatas所有元素均为已知值,不会出现字段丢失问题。
- 执行
注意:不要通过给rrdatas字段加lifecycle.ignore_changes的方式规避报错,该操作会导致后续DNS记录的变更无法被Terraform感知,引发配置漂移。
内容的提问来源于stack exchange,提问作者Zymotik
相关产品推荐
相关产品推荐

