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

Terraform为Cloud Run创建动态Secret变量块时value_from报错如何解决

核心错误原因

两次报错的核心问题出在动态块的语法缺失和遍历参数错误:

  1. 第二次调整后的dynamic "value_from"块没有加content包裹内部的secret_key_ref配置,不符合Terraform动态块的语法要求,Terraform无法识别你定义的value_from块结构,因此抛出不支持该块类型的错误。
  2. dynamic "value_from"的for_each参数传入了字符串类型的env.value.name,Terraform会将字符串拆分为单个字符的列表遍历,完全不符合预期。
  3. 直接遍历list类型的secrets时,each.key是列表的下标索引,不是你想要的Secret名称。

修复后的完整配置

步骤1:先优化变量定义(可选但推荐)

用严格的对象类型替代list(any),避免非法值传入:

variable "secrets" {
  type = list(object({
    name    = string # Secret Manager中对应的Secret名称
    version = string # 要引用的Secret版本号
  }))
  default = []
}

变量取值保持你之前的写法即可:

secrets = [
  {
    name    = "SECRET"
    version = "1"
  }
]

步骤2:修正动态块配置

dynamic "env" {
  # 先把列表转成map,避免后续列表顺序变化导致Cloud Run服务被不必要重建
  for_each = { for secret in var.secrets : secret.name => secret }
  content {
    name = env.key
    dynamic "value_from" {
      # 单元素列表,保证每个env只对应一个value_from块
      for_each = [env.value]
      content {
        secret_key_ref {
          name = value_from.value.name
          key  = value_from.value.version
        }
      }
    }
  }
}

如果你要回到最早的字符串列表方案(不需要自定义版本号,所有secret都用版本1)

变量定义为list(string),取值示例:

secrets = ["SECRET1", "SECRET2"]

对应动态块配置:

dynamic "env" {
  for_each = toset(var.secrets)
  content {
    name = each.value
    value_from {
      secret_key_ref {
        name = each.value
        key  = "1"
      }
    }
  }
}

如果这个方案还是报错,确认两点:

  • 你的env块是写在google_cloud_run_service资源的template.spec.containers层级下,不是其他层级
  • 你的hashicorp/google provider版本大于等于3.5版本,支持value_from块配置

内容的提问来源于stack exchange,提问作者fuzzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:24:03