Terraform如何仅在变量匹配特定值时生成资源对应配置块
Terraform Interconnect Attachment 条件配置解决方案
问题根因
你混淆了普通参数赋值和嵌套块动态生成的适用场景:ipsec_internal_addresses是google_compute_interconnect_attachment资源的列表类型顶层参数,不是可重复声明的嵌套块,所以不需要用dynamic块实现条件渲染,你之前的dynamic写法属于用错了对象。
正确实现代码
resource "google_compute_interconnect_attachment" "interconnect-attachment" { project = var.project region = var.region name = var.name edge_availability_domain = var.availability_domain type = var.type router = google_compute_router.router.name encryption = var.encryption # 条件逻辑:仅加密类型为IPSEC时传入地址列表,否则等价于不声明该参数 ipsec_internal_addresses = var.encryption == "IPSEC" ? [var.address] : null }
逻辑说明
- Terraform 0.12及以上版本中,参数赋值为
null等价于完全不声明该参数,不会出现在最终发给云厂商Provider的资源请求里,完全满足你“非IPSEC场景下该配置完全不出现”的要求,也不会触发null值报错。 - 如果你之前测试时遇到赋值null也报错的情况,可将Google Provider升级到4.0及以上正式版本,该版本已经完全适配Terraform的null参数忽略逻辑。
疑问解答
dynamic块仅用于生成可重复声明的嵌套配置块,比如部分资源支持多次声明的ingress规则、tag配置这类嵌套结构,才需要用dynamic循环生成。而ipsec_internal_addresses本身就是接受列表值的顶层参数,直接给它赋值即可,不需要也不能用dynamic块定义。
内容的提问来源于stack exchange,提问作者djsmiley2kStaysInside
相关产品推荐
相关产品推荐

