Terraform中引用map内变量并迭代的正确语法咨询
问题原因
你遇到的错误是因为Terraform变量的默认值只能是静态常量,不能引用数据源(data)、资源这类需要在Terraform运行阶段解析的动态对象,所以在variable "tunnel_map"的default里写data.berglas_secret.tunnel_key_1会触发这个报错。
正确实现方式
改用locals块来存储包含数据源引用的映射,locals支持引用动态对象,然后在资源里通过for_each迭代这个local映射:
data "berglas_secret" "tunnel_key_1" { bucket = "my-bucket" name = "tunnel1" } data "berglas_secret" "tunnel_key_2" { bucket = "my-bucket" name = "tunnel2" } # 用locals替代variable存储动态映射 locals { tunnel_map = { 1 = { shared_secret = data.berglas_secret.tunnel_key_1.plaintext } 2 = { shared_secret = data.berglas_secret.tunnel_key_2.plaintext } } } resource "google_compute_vpn_tunnel" "compute_tunnels" { for_each = local.tunnel_map # 注意要取plaintext字段,因为berglas_secret数据源的明文存在这个字段里 shared_secret = each.value.shared_secret # 补充资源必填字段(示例仅做参考,需根据实际配置调整) name = "tunnel-${each.key}" target_vpn_gateway = google_compute_vpn_gateway.example.id peer_ip = "x.x.x.x" }
关键改动说明
- 用
locals替换variable:locals可以引用数据源、资源等动态对象,适合存储需要运行时计算的映射。 - 引用
plaintext字段:Berglas数据源的解密后明文存在plaintext属性里,直接引用数据源对象会传递整个数据源结构,必须指定具体字段才能拿到共享密钥值。 - 补充资源必填字段:
google_compute_vpn_tunnel还有其他必填参数(比如name、target_vpn_gateway等),实际使用时要根据你的配置补充完整。
内容的提问来源于stack exchange,提问作者John Tan
相关产品推荐
相关产品推荐

