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

如何在Terraform中建立应用与环境变量集的N对N关联

Terraform应用与环境变量集关联问题解决方案

需求概述

我正在开发一个Terraform模块,需创建以下资源:

  • Applications
  • 环境变量集(Set of environment variables)
  • 环境变量(Environment variables)

核心规则

  • 每个应用属于一个或多个环境(例如dev、stage、prod)
  • 每个应用可关联零个或多个环境变量集
  • 所有环境变量均属于某一个环境变量集

已编写代码(含修正)

locals {
  apps = {
    "app01" = { envs = ["dev", "prod"] },
    "app02" = { envs = ["dev"] }
  }
  # 修正原代码中的错误:app_value.environments 改为 app_value.envs
  flatten_apps = flatten([
    for app_key, app_value in local.apps : [
      for env in app_value.envs : [
        { "${app_key}-${env}" = merge(app_value, { environment = "${env}" }) }
      ]
    ]
  ])
  # apps_envs 最终结果:
  # apps_envs = {
  #   "app01-dev"  = { envs = ["dev", "prod"], environment = "dev" },
  #   "app01-prod" = { envs = ["dev", "prod"], environment = "prod" },
  #   "app02-dev"  = { envs = ["dev"], environment = "dev" },
  # }
  apps_envs = { for app in local.flatten_apps : keys(app)[0] => values(app)[0] }
  env_vars = {
    "dev" = {
      "var01" = { value = "value01" }
      "var02" = { value = "value02" }
    }
    "prod" = {
      "var03" = { value = "value03" }
    }
  }
  # flatten_env_vars 最终结果:
  # flatten_env_vars = [
  #   {
  #     environment = "dev"
  #     key         = "var01"
  #     value       = "value01"
  #   },
  #   {
  #     environment = "dev"
  #     key         = "var02"
  #     value       = "value02"
  #   },
  #   {
  #     environment = "prod"
  #     key         = "var03"
  #     value       = "value03"
  #   },
  # ]
  flatten_env_vars = flatten([
    for env_name, env_env_vars in local.env_vars : [
      for env_var_key, env_var_value in env_env_vars : [
        merge(env_var_value, { environment = env_name, key = env_var_key })
      ]
    ]
  ])
}

# 创建所有应用实例(如app01-dev、app01-prod、app02-dev)
resource "application" "apps" {
  for_each = local.apps_envs
  name     = each.key
}

# 创建环境变量集
resource "set_of_env_vars" "env_vars" {
  for_each = local.env_vars
  name     = "${each.key}-env-vars"
}

# 创建环境变量并关联到对应集合
resource "env_var" "env_vars" {
  count = length(local.flatten_env_vars)

  key   = local.flatten_env_vars[count.index].key
  value = local.flatten_env_vars[count.index].value

  set_of_env_vars_id = resource.set_of_env_vars.env_vars[local.flatten_env_vars[count.index].environment].id
}

问题

无法通过application_set_of_env_vars资源将每个环境变量集关联到对应的应用。每个环境变量集和应用都属于同一环境,但不存在environment资源且无法创建,需要通过Terraform嵌套循环解决但不知如何操作。

解决方案

直接在application_set_of_env_vars资源中使用嵌套循环式的for_each,基于已有的local.apps_envs集合,为每个应用实例关联其对应环境的环境变量集:

# 将应用与对应环境的环境变量集关联
resource "application_set_of_env_vars" "app_set" {
  for_each = {
    for app_key, app_details in local.apps_envs :
    # 生成唯一键,确保每个应用-环境集配对唯一
    "${app_key}-${app_details.environment}-set" => {
      app_id = application.apps[app_key].id
      set_id = set_of_env_vars.env_vars[app_details.environment].id
    }
  }

  application_id     = each.value.app_id
  set_of_env_vars_id = each.value.set_id
}

说明

  1. 唯一键生成:通过${app_key}-${app_details.environment}-set生成每个关联的唯一标识符,避免重复资源。
  2. 关联逻辑:利用local.apps_envs中每个应用实例的environment字段,直接匹配同环境的set_of_env_vars资源,不需要额外创建environment资源。
  3. 动态遍历:通过for_each遍历应用实例集合,自动为每个符合条件的应用-环境集配对创建关联资源,实现嵌套循环的效果。

内容的提问来源于stack exchange,提问作者Vitor Falcão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:40:28