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

Terraform中for_each结合flatten数据报错,求排查指导

错误原因与解决方案

错误原因

核心问题是aws_account_alternate_contact资源的alternate_contact_type属性要求传入单个字符串,但你当前赋值的each.value.contacts.contact_type是包含3个元素的数组(tuple),类型不匹配导致报错。

另外,你的本地值构造逻辑仅按账号拆分数据,但每个账号条目里仍保留完整的联系人类型、邮箱等数组,未将账号与对应的联系人信息一一绑定,这是根本问题所在。

修正后的代码

调整本地值构造

重新构造本地值,将每个账号与每个联系人类型、对应姓名、邮箱等信息一一配对,生成每个资源实例所需的独立条目:

locals {
  alternate_contacts = {
    contacts = {
      title         = "yes"
      contact_type  = ["BILLING", "OPERATIONS", "SECURITY"]
      aws_account   = ["12345", "67891", "11213"]
      email_address = ["bills@example.com", "ops@example.com", "sec@example.com"]
      name          = ["bills", "ops", "sec"]
      phone_number  = "123456789"
    }
  }

  # 遍历每个账号,同时遍历联系人类型的索引,绑定对应信息
  account_contacts = flatten([
    for acc_id in local.alternate_contacts.contacts.aws_account : [
      for idx, contact_type in local.alternate_contacts.contacts.contact_type : {
        acc_id               = acc_id
        alternate_contact_type = contact_type
        name                 = local.alternate_contacts.contacts.name[idx]
        email_address        = local.alternate_contacts.contacts.email_address[idx]
        title                = local.alternate_contacts.contacts.title
        phone_number         = local.alternate_contacts.contacts.phone_number
      }
    ]
  ])

  # 转成for_each需要的映射,用"账号ID-联系人类型"作为唯一键
  account_contacts_map = {
    for item in local.account_contacts : "${item.acc_id}-${item.alternate_contact_type}" => item
  }
}

修正资源定义

使用新构造的映射遍历,每个资源实例对应一个账号的单个联系人类型:

resource "aws_account_alternate_contact" "alternate_contacts" {
  for_each = local.account_contacts_map

  alternate_contact_type = each.value.alternate_contact_type
  name                   = each.value.name
  title                  = each.value.title
  email_address          = each.value.email_address
  phone_number           = each.value.phone_number
  account_id             = each.value.acc_id
}

说明

  • 新的account_contacts本地值会生成9个条目(3个账号 × 3种联系人类型),每个条目包含单个账号、单个联系人类型及对应姓名、邮箱等字符串属性,完全符合资源的参数要求。
  • account_contacts_map用账号ID-联系人类型作为键,确保每个资源实例的键唯一,满足for_each对映射键唯一性的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:05:01