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

如何解析Terraform本地变量为每个用户调用Redshift用户模块

解决方案

得先把嵌套的团队用户结构扁平化成单个用户的条目集合,这样才能为每个用户单独调用模块。

1. 新增扁平化的用户本地变量

在现有locals里加一个处理后的扁平结构,把每个用户的用户名、角色、所属团队单独封装:

locals {
  teams = {
    "team1" = {
      "username1" = ["role1", "role2", "role3"],
      "username2" = ["role1", "role2"]
    },
    "team2" = {
      "username3" = ["role1", "role2", "role3"],
      "username4" = ["role1", "role2"]
    }
  }

  # 扁平化处理:将每个用户的信息单独提取为一条记录
  redshift_users = merge([
    for team_name, users in local.teams : {
      for username, roles in users : "${team_name}_${username}" => {
        username   = username
        roles      = roles
        team_name  = team_name
      }
    }
  ]...)
}

这里用Terraform嵌套for表达式生成了全局唯一的用户标识(team_name_username),对应的值包含模块需要的所有参数,满足for_each对键唯一性的要求。

2. 基于扁平列表调用模块

现在直接用扁平化后的集合作为for_each的数据源,每个用户会单独触发一次模块调用:

module "redshift_user" {
  for_each = local.redshift_users

  source      = "../../../modules/redshift-users"
  username    = each.value.username
  roles       = each.value.roles
  team_name   = each.value.team_name
}

为什么原来的写法不行?

你之前用for_each = local.teams,会让模块按团队实例化,每个团队调用一次模块,而不是每个用户。这种情况下keys(each.value)会返回整个团队的所有用户名列表,values(each.value)返回所有角色列表,根本没法对应到单个用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:42:53