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

Terraform模块中如何通过传入的环境变量访问locals对应键?

Terraform模块中动态访问环境专属本地配置的实现方法

问题描述

在Terraform模块中定义了环境变量:

variable "environment" {
  type = string
}

同时通过locals定义了环境专属配置:

locals {
  dev = {
    foo = "bar"
  }
}

需求是通过传入的var.environment变量,动态访问locals中对应环境的配置,预期效果类似locals.${var.environment}.foo(当var.environment为dev时),想问是否可以用local[var.environment]["foo"]实现?

实现方案

直接用local[var.environment]["foo"]在当前的locals定义下无法实现,因为Terraform的local对象是包含多个顶级属性的结构体,你目前把dev作为了local的顶级键,这种情况下动态索引顶级属性的写法不被Terraform支持。

正确的做法是把所有环境的配置统一放到一个嵌套的map里,调整locals的定义:

locals {
  environments = {
    dev = {
      foo = "bar"
    }
    # 可按需添加其他环境配置,比如prod、staging
    prod = {
      foo = "prod_bar"
    }
  }
}

之后就可以通过动态索引的方式访问对应环境的配置了,两种写法都有效:

# 点语法
local.environments[var.environment].foo

# 索引语法
local.environments[var.environment]["foo"]

当var.environment传入dev时,就能获取到"bar"的值。

另外建议给var.environment添加可选值约束,避免传入不存在的环境名称引发错误:

variable "environment" {
  type        = string
  description = "部署环境名称"
  validation {
    condition     = contains(keys(local.environments), var.environment)
    error_message = "环境名称无效,可选值为: ${join(", ", keys(local.environments))}。"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:15:25