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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:50:25