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

如何在Terraform/Terragrunt中优雅遍历字符串列表?

问题

现有Terraform变量结构如下:

iam_access = {
    external_iam_users = {
      "environment1" = {
        iam_users = ["user1", "user2", "user3"]
      },
      "environment2" = {
        iam_users = ["user4", "user5"]
      },
    }
}

已定义本地值:

locals {
  user_access = merge([
    for external_iam_users in var.iam_access: {
      for key,iam_users in external_iam_users : "${key}" => {
        for key1,users in iam_users : "${key1}" => {
          users = users
        }
      }
    }
  ]...)
}

在编写aws_iam_user_policy_attachment资源时,目前只能通过user = each.value.iam_users.users[0]获取用户列表的第一个用户,如何修改代码实现遍历所有用户?


解决方案

1. 重构本地值,扁平化用户列表

原有的user_access把用户列表嵌套在多层结构中,不利于遍历。我们可以直接生成一个扁平化的用户集合,把所有环境下的用户提取到一维结构里:

locals {
  # 生成包含环境名和用户名的扁平化列表,方便后续唯一标识用户
  flattened_users = flatten([
    for env_name, env_data in var.iam_access.external_iam_users : [
      for username in env_data.iam_users : {
        environment = env_name
        username    = username
      }
    ]
  ])
}

2. 遍历扁平化列表创建策略附件

利用for_each遍历扁平化后的用户列表,为每个用户单独创建IAM策略附件:

resource "aws_iam_user_policy_attachment" "user_policy" {
  # 用「环境名-用户名」作为唯一键,避免资源重复
  for_each = { for user_item in local.flattened_users : "${user_item.environment}-${user_item.username}" => user_item }

  user       = each.value.username
  policy_arn = "arn:aws:iam::123456789012:policy/Your-Target-Policy" # 替换为你的目标策略ARN
}

简化版(无需环境信息)

如果不需要关联环境信息,也可以直接生成纯用户列表:

locals {
  all_users = flatten([
    for env_data in var.iam_access.external_iam_users : env_data.iam_users
  ])
}

resource "aws_iam_user_policy_attachment" "user_policy" {
  # 用「索引-用户名」作为唯一键,确保每个用户对应唯一资源
  for_each = { for idx, username in local.all_users : "${idx}-${username}" => username }

  user       = each.value
  policy_arn = "arn:aws:iam::123456789012:policy/Your-Target-Policy"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:17:47