如何在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 }
说明
- 唯一键生成:通过
${app_key}-${app_details.environment}-set生成每个关联的唯一标识符,避免重复资源。 - 关联逻辑:利用
local.apps_envs中每个应用实例的environment字段,直接匹配同环境的set_of_env_vars资源,不需要额外创建environment资源。 - 动态遍历:通过
for_each遍历应用实例集合,自动为每个符合条件的应用-环境集配对创建关联资源,实现嵌套循环的效果。
内容的提问来源于stack exchange,提问作者Vitor Falcão
相关产品推荐
相关产品推荐

