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

