You need to enable JavaScript to run this app. Terraform如何从按OU分组的嵌套账户map生成单条目map
优惠活动
大模型
产品
解决方案
定价
更多

Terraform如何从按OU分组的嵌套账户map生成单条目map

解决方案

你遇到的each对象报错是因为该对象仅支持在配置了for_each参数的resource、module块内使用,locals块处理嵌套结构需使用Terraform原生for表达式完成。


方式1:批量自动生成所有单账户Map(推荐)

不需要逐个定义账户,新增/删除账户时自动同步,代码如下:

locals {
  # 第一步:把嵌套的所有子账户map合并为一级map,格式为{账户名 = 账户ID}
  flat_account_ids = merge(values(var.aws_accounts)...)
  # 第二步:转换为你需要的单键map结构,格式为{账户名 = {账户名 = 账户ID}}
  account_maps = {
    for acc_name, acc_id in local.flat_account_ids :
    acc_name => { (acc_name) = acc_id }
  }
}

使用方式:直接通过local.account_maps.first_account、local.account_maps.second_account引用即可,效果和你预期的local.first_account完全一致。
注:该方案无需硬编码任何账户名,只要修改var.aws_accounts的定义就会自动更新所有账户的引用值


方式2:单独定义指定账户的Local值

如果你需要单独的local.first_account这类独立变量,直接从原变量取值即可,不需要迭代逻辑:

locals {
  first_account  = { first_account = var.aws_accounts.first_ou.first_account }
  second_account = { second_account = var.aws_accounts.first_ou.second_account }
  third_account  = { third_account = var.aws_accounts.second_ou.third_account }
  fourth_account = { fourth_account = var.aws_accounts.second_ou.fourth_account }
}

该方式逻辑直观,适合仅需要引用少数固定账户的场景。


效果验证

你可以通过如下output测试返回结果:

output "first_account_result" {
  value = local.account_maps.first_account
}

执行terraform plan后可以看到输出结果完全符合你的预期:

first_account_result = {
  "first_account" = "111111111"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 03:09:02