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

Terraform中for_each场景下如何动态引用Secret Manager数据源的密码值

解决方案

报错的核心原因是Terraform不支持在资源引用的名称段使用动态插值,data.google_secret_manager_secret_version.后面的部分必须是静态声明的资源名,不能直接插入each.value这类动态值,以下是两种可行的变通方案:

方案1:批量声明数据源(更推荐,易维护)

适合需要管理多个同类型secret的场景,无需逐个声明数据源

  • 先定义本地值映射所有secret的标识与ID:
locals {
  # 键为你业务逻辑中使用的secret标识,值为Secret Manager对应的secret ID
  mysql_secrets = {
    "mysql_db_secret_001" = var.mysql_secret_id_001
    "mysql_db_secret_002" = var.mysql_secret_id_002
    "mysql_db_secret_003" = var.mysql_secret_id_003
  }
}
  • 用for_each批量声明数据源:
data "google_secret_manager_secret_version" "mysql_db_password" {
  for_each = local.mysql_secrets
  project  = var.project_id
  provider = google-beta
  secret   = each.value
  depends_on = [
    module.mysql_db_password_001,
    module.mysql_db_password_002,
    module.mysql_db_password_003
  ]
}
  • 修改ABC模块中的密码引用:
additional_users = [
  {
    name     = each.value.mysql_db_user
    # 通过动态key从批量生成的数据源中取对应密码
    password = data.google_secret_manager_secret_version.mysql_db_password[each.value.mysql_db_secret].secret_data
  }
]

方案2:映射现有数据源(无需修改已有数据源声明)

如果你不想改动已经逐个写好的mysql_db_password_001等数据源,可以先把所有数据源的值预拼成映射表:

  • 定义本地值汇总所有密码:
locals {
  mysql_password_map = {
    "mysql_db_secret_001" = data.google_secret_manager_secret_version.mysql_db_password_001.secret_data
    "mysql_db_secret_002" = data.google_secret_manager_secret_version.mysql_db_password_002.secret_data
    "mysql_db_secret_003" = data.google_secret_manager_secret_version.mysql_db_password_003.secret_data
  }
}
  • 修改ABC模块中的密码引用:
password = local.mysql_password_map[each.value.mysql_db_secret]

内容的提问来源于stack exchange,提问作者Sanjay M. P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:39:01