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.
相关产品推荐
相关产品推荐

