如何解析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
相关产品推荐
相关产品推荐

