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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:06:28