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

