如何提取Terraform map中值为DEV的键生成DEV账号ID列表
Terraform 按Map值筛选对应键列表实现方案
注意:你给出的示例
account_map存在重复键333333333333,Terraform的Map类型不支持重复键,后写入的"PROD"会覆盖之前的"STG"值,实际使用时需要先修正这个重复键问题。
实现这个需求不需要依赖额外复杂逻辑,直接用Terraform原生的for列表表达式配合条件判断即可。单独使用keys()函数只能全量返回Map的所有键,本身不具备按值筛选的能力。
具体实现代码
locals { # 修正重复键后的账号Map示例 account_map = { "111111111111" = "DEV" "222222222222" = "DEV" "333333333333" = "STG" "444444444444" = "PROD" } # 筛选值为DEV的账号ID列表 dev_accounts = [for account_id, env in local.account_map : tostring(account_id) if env == "DEV"] }
逻辑说明
- 方括号包裹的
for表达式会直接生成列表类型结果 - 遍历Map时
account_id接收键(即账号ID),env接收对应的值(即环境标识) - 末尾的
if env == "DEV"是筛选规则,仅保留值匹配DEV的条目 - 冒号后的
tostring(account_id)指定符合条件的条目返回账号ID作为列表元素,加tostring()是为了避免把账号ID写成数字类型时和预期的字符串类型列表不符,如果你的Map键本身就是字符串类型可以去掉这个转换函数
可以通过输出块验证结果:
output "dev_accounts" { value = local.dev_accounts }
执行Terraform计划后得到的输出和你预期的格式完全一致:
dev_accounts = ["111111111111", "222222222222"]
如果需要筛选其他环境的账号列表,只需要修改if后的匹配值即可,比如筛选STG环境就把条件改为if env == "STG"。
内容的提问来源于stack exchange,提问作者hlesnt395
相关产品推荐
相关产品推荐

