Terraform嵌套循环处理含列表的映射生成账户分配映射问题
解决方案
1. 统一处理多类型字段(字符串/列表)
核心思路是先用tolist()将account和permission_set_name字段统一转为列表类型,避免字符串无法迭代的报错,再通过嵌套循环+flatten()生成扁平化的单账户单权限集条目,最终转为映射供for_each使用。
示例代码:
# 原始输入的local变量 locals { account_assignments_test = [ { account = "123456789012" # 字符串类型单账户 permission_set_name = "ReadOnlyAccess" # 字符串类型单权限集 principal_type = "USER" principal_id = "user-123" }, { account = ["987654321098", "456789012345"] # 列表类型多账户 permission_set_name = ["AdministratorAccess", "BillingAccess"] # 列表类型多权限集 principal_type = "GROUP" principal_id = "group-456" } ] # 扁平化处理:拆分多账户、多权限集为独立条目 flattened_account_assignments = flatten([ for assignment in local.account_assignments_test : [ # 将account统一转为列表(字符串自动转为单元素列表) for account in tolist(assignment.account) : [ # 将permission_set_name统一转为列表 for permission_set in tolist(assignment.permission_set_name) : { account = account permission_set_name = permission_set principal_type = assignment.principal_type principal_id = assignment.principal_id } ] ] ]) # 转为映射,生成唯一键供for_each使用 account_assignments_map = { for idx, item in local.flattened_account_assignments : "${item.principal_type}-${item.principal_id}-${item.permission_set_name}-${item.account}" => item } } # 权限集资源(如果权限集是批量创建的) resource "aws_ssoadmin_permission_set" "example" { for_each = toset(["ReadOnlyAccess", "AdministratorAccess", "BillingAccess"]) instance_arn = aws_ssoadmin_instance.example.arn name = each.key # 按需添加其他配置(比如会话时长、描述等) } # SSO账户分配资源,使用处理后的映射 resource "aws_ssoadmin_account_assignment" "example" { for_each = local.account_assignments_map instance_arn = aws_ssoadmin_instance.example.arn permission_set_arn = aws_ssoadmin_permission_set.example[each.value.permission_set_name].arn principal_type = each.value.principal_type principal_id = each.value.principal_id target_type = "AWS_ACCOUNT" target_id = each.value.account }
2. 关于permission_set_name列表的迭代支持
完全支持对permission_set_name的列表进行迭代,上述代码中已经实现:通过tolist()将该字段统一转为列表后,嵌套遍历每个权限集,与每个账户、主体信息组合成独立的分配条目,最终覆盖所有账户-权限集-主体的组合场景。
关键说明
tolist():自动兼容字符串和列表类型,将字符串转为单元素列表,保证迭代逻辑统一。flatten():将嵌套的列表结构拍平为一维列表,方便后续转为映射。- 映射的唯一键:通过
principal_type、principal_id、permission_set_name、account的组合生成,确保每个分配条目唯一,符合Terraform对for_each键的唯一性要求。
内容的提问来源于stack exchange,提问作者Bakka
相关产品推荐
相关产品推荐

