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

使用Terraform部署Vault架构时循环配置遇到问题求助

Terraform部署Vault循环配置问题解决

需要实现遍历JSON配置文件中的每个条目,在Vault的staging kv-v2挂载点下创建对应路径的空密钥,但当前代码无法正确完成循环逻辑,导致资源部署失败。

原main.tf代码

locals {
    all_data = jsondecode(file("data.json"))
    config = local.all_data.Config
}

resource "vault_mount" "staging" {
    path = "staging"
    type = "kv-v2"
    description = "Staging environment secrets"  
}

resource "vault_kv_secret_v2" "config" {
    for_each = toset(local.config)

    mount                      = vault_mount.staging.path
    name                       = each.key
    cas                        = 1
    delete_all_versions        = true

    data_json                  = jsonencode(
    {
      (each.value.NAME) = ""
    }
    )
}

原data.json数据文件

{"Config" : [
    {"Config/partoo" : {
        "NAME" : ["apiKey"]
    }},
    {"Config/toucan" : {
        "NAME" : ["embedErId", "embedSlmId"]
    }},
    {"Config/hubspot" : {
        "NAME" :["clientId", "clientSecret"]
    }}, 
    {"Config/sendGrid" : {
        "NAME" :["key"]
    }}
]}

问题核心

  1. local.config是数组类型,每个元素是仅含单个键值对的对象,toset(local.config)无法正确提取路径和密钥名称列表;
  2. NAME是数组类型,直接作为JSON键会导致格式错误,需将数组中每个密钥名称设为空值。

修改后的代码

main.tf

locals {
    all_data = jsondecode(file("data.json"))
    # 将数组中单个键值对的对象合并为统一map,键为路径,值为含NAME数组的对象
    config_map = merge(local.all_data.Config...)
}

resource "vault_mount" "staging" {
    path        = "staging"
    type        = "kv-v2"
    description = "Staging environment secrets"  
}

resource "vault_kv_secret_v2" "config" {
    # 用config_map的键作为每个资源实例的唯一标识
    for_each = local.config_map

    mount                = vault_mount.staging.path
    name                 = each.key
    cas                  = 1
    delete_all_versions  = true

    # 遍历NAME数组,生成每个密钥名称对应的空值键值对
    data_json = jsonencode({
        for key in each.value.NAME : key => ""
    })
}

修改说明

  1. 数据结构转换:通过merge(local.all_data.Config...)将原数组转换为键值对结构的map,让for_each能直接遍历路径和对应配置;
  2. 密钥名称处理:用for表达式遍历NAME数组,为每个密钥名称生成空值映射,符合Vault kv-v2的存储要求;
  3. for_each优化:直接使用map作为for_each数据源,每个路径对应唯一资源实例,避免数组遍历的类型兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:46:40