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

