如何让Terraform在external数据源返回空ID时触发plan阶段报错
解决方案
你可以通过Terraform内置的生命周期前置校验规则实现需求,该方案不需要修改原有for_each逻辑,可直接在google_compute_backend_service资源块内生效,校验失败会在terraform plan阶段直接抛出错误终止执行。
方案1:资源级前置校验(推荐,Terraform 0.13+ 支持)
直接在google_compute_backend_service资源块内添加lifecycle.precondition规则,对当前实例对应的data.external.mydata返回结果做非空校验:
resource "google_compute_backend_service" "default" { for_each = local.backend name = each.key # 你原有配置的其他参数,比如端口、协议、健康检查等... lifecycle { precondition { condition = data.external.mydata[each.key].result.id != "" error_message = "Backend ${each.key} 对应的数据源返回id为空,请检查执行脚本的返回值逻辑。" } } # 你原有的backend动态块配置 dynamic "backend" { for_each = ... content { group = data.external.mydata[each.key].result.id # 其他backend参数 } } }
该规则会在资源规划阶段优先执行,只要condition返回值为假,就会直接输出你定义的错误信息并终止plan流程,不会继续后续的资源计算。
方案2:Local值全局校验(兼容旧版本Terraform)
如果你使用的Terraform版本不支持precondition,可以在本地值(local)阶段提前做全局校验,只要存在空id就直接抛出错误:
# 原有local.backend定义保持不变 locals { backend = { for k, v in var.backends : k => v } # 新增全局校验逻辑(Terraform 1.2+ 可直接使用abort函数抛出错误) backend_id_valid = alltrue([ for k in keys(local.backend) : length(data.external.mydata[k].result.id) > 0 ? true : abort("Backend ${k} 返回的id为空") ]) }
本地值的计算优先级高于资源块,因此只要存在空id,会在资源规划前就触发错误终止执行。
内容的提问来源于stack exchange,提问作者Fixlensmith
相关产品推荐
相关产品推荐

