You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:33:16