Terraform遍历AzureAD组成员获取用户邮箱的实现疑问
解决方案
你需要先把所有AzureAD组的成员整合为一个唯一的用户ID集合(避免重复获取同一用户),再通过该集合遍历获取用户邮箱,最后关联回对应项目。
1. 整合所有组的成员ID并去重
在现有locals块中添加以下代码,将所有项目组的成员ID扁平化后转为集合(自动去重):
locals { # 保留你已有的projects和projects__map定义 # 整合所有AzureAD组的成员ID,去重后得到唯一用户ID集合 all_project_member_ids = toset(flatten([ for group in data.azuread_group.project_group : group.members ])) }
2. 获取所有成员的用户信息
使用上述用户ID集合作为for_each参数,批量获取AzureAD用户的完整数据(包含邮箱):
data "azuread_user" "project_users" { for_each = local.all_project_member_ids object_id = each.key }
3. 关联项目与成员邮箱
创建本地映射,将每个项目直接关联到其对应的成员邮箱列表:
locals { # 每个项目对应的成员邮箱列表 project_member_emails = { for proj in local.projects : proj.resource => [ for member_id in data.azuread_group.project_group[proj.resource].members : data.azuread_user.project_users[member_id].mail ] } }
使用方式
现在你可以通过local.project_member_emails["project1"]直接获取project1对应的所有成员邮箱地址。
关键说明
- 用
flatten将多个组的成员列表合并为一维列表,再通过toset自动去重,避免重复调用azuread_user数据源获取同一用户,提升效率。 - Terraform不支持
data.azuread_group.project_group[?].members这类模糊索引语法,必须通过for表达式明确遍历所有组来收集成员ID。
内容的提问来源于stack exchange,提问作者Ľuboš Olejár
相关产品推荐
相关产品推荐

