如何在Terraform中通过Azure AD组名获取对象ID创建角色分配?
解决Azure角色分配中通过组名获取对象ID的问题
实现方案
1. 批量查询Azure AD组对象ID
先提取变量中所有唯一的组名,再通过for_each批量创建azuread_group数据源,一次性获取所有组的对象ID:
locals { # 提取所有不重复的组名,避免重复查询 all_unique_groups = distinct(flatten(values(var.role_assignments))) } data "azuread_group" "groups" { for_each = toset(local.all_unique_groups) display_name = each.key }
2. 创建角色分配资源
直接在角色分配中通过组名索引对应的数据源,获取对象ID填入principal_id:
resource "azurerm_role_assignment" "role_assignment" { for_each = { for item in local.groupsbyrole : "${item.role_name}.${item.group_name}" => item } scope = azurerm_resource_group.az-rg.id role_definition_name = each.value.role_name # 通过组名从数据源中获取对应的对象ID principal_id = data.azuread_group.groups[each.value.group_name].object_id skip_service_principal_aad_check = var.skip_service_principal_aad_check }
可选优化:提前关联对象ID到本地变量
如果希望本地变量直接包含对象ID,可以调整groupsbyrole的定义,提前把对象ID关联进去:
locals { groupsbyrole = flatten([ for role_name, group_list in var.role_assignments : [ for group_name in group_list : { role_name = role_name group_name = group_name object_id = data.azuread_group.groups[group_name].object_id } ] ]) } # 角色分配中直接使用预关联的object_id resource "azurerm_role_assignment" "role_assignment" { for_each = { for item in local.groupsbyrole : "${item.role_name}.${item.group_name}" => item } scope = azurerm_resource_group.az-rg.id role_definition_name = each.value.role_name principal_id = each.value.object_id skip_service_principal_aad_check = var.skip_service_principal_aad_check }
核心逻辑说明
- Terraform支持在数据源上使用
for_each,可以批量处理多个组的查询需求,避免手动逐个定义数据源 - 使用
distinct和flatten处理变量中的组名列表,确保每个组只被查询一次,提升效率 - 通过组名作为索引直接访问对应的数据源属性,实现组名到对象ID的精准映射
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

