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

使用Terraform在Azure中创建External Identities并分配给用户

解决Terraform Azure外部身份(External Identities)创建与关联问题

一、关于External Identities对应的Terraform资源

Azure的External Identities是涵盖来宾用户、外部身份提供商等场景的功能集合。在Terraform中没有单独命名为External Identities的资源——你通过azuread_invitation创建的来宾用户,本身就是External Identities的核心载体,这类用户天然属于外部身份范畴。

二、关联External Identities(来宾用户)与权限/组

创建邀请后,受邀用户接受邀请会成为Azure AD中的来宾用户,可通过以下步骤完成关联操作:

1. 获取已创建的来宾用户

使用azuread_user数据源,通过来宾用户的特殊UPN格式(外部邮箱+租户后缀)定位用户:

data "azuread_user" "invited_users" {
  for_each = var.invited_users
  # 来宾用户UPN格式:外部邮箱#EXT#@租户域名
  user_principal_name = "${each.key}#EXT#@<你的租户域名>.onmicrosoft.com"
  # 依赖邀请资源,确保邀请已发送
  depends_on = [azuread_invitation.invited_users]
}

注意:替换<你的租户域名>为实际Azure AD租户的域名。

2. 将来宾用户分配到指定组

结合你现有变量中的groups列表,使用azuread_group_member资源将用户加入对应组:

resource "azuread_group_member" "invited_user_groups" {
  for_each = flatten([
    for user_key, user in var.invited_users : [
      for group_id in user.groups : {
        unique_key = "${user_key}-${group_id}"
        user_key   = user_key
        group_id   = group_id
      }
    ]
  ])

  group_object_id = each.value.group_id
  member_object_id = data.azuread_user.invited_users[each.value.user_key].object_id
}

3. 整合后的完整代码

variable "invited_users" {
  type = map(object({
    name  = string
    groups = list(string)
  }))
}

# 配置你的Azure AD租户域名
variable "tenant_domain" {
  type = string
  default = "your-tenant-domain.onmicrosoft.com"
}

resource "azuread_invitation" "invited_users" {
  for_each = var.invited_users

  user_email_address = each.key
  redirect_url       = "https://portal.azure.com"
  user_display_name  = each.value.name

  message {
    body                  = "Invitation to my tenant"
    additional_recipients = ["test@mail.com"]
  }
}

data "azuread_user" "invited_users" {
  for_each = var.invited_users
  user_principal_name = "${each.key}#EXT#@${var.tenant_domain}"
  depends_on = [azuread_invitation.invited_users]
}

resource "azuread_group_member" "invited_user_groups" {
  for_each = flatten([
    for user_key, user in var.invited_users : [
      for group_id in user.groups : {
        unique_key = "${user_key}-${group_id}"
        user_key   = user_key
        group_id   = group_id
      }
    ]
  ])

  group_object_id = each.value.group_id
  member_object_id = data.azuread_user.invited_users[each.value.user_key].object_id
}

关键注意事项

  • 来宾用户需先接受邀请,Azure AD才会生成正式的用户对象,若用户未接受,azuread_user数据源会报错。可添加ignore_missing = true临时跳过未接受的用户,或在逻辑中处理接受后的触发逻辑。
  • 若需给外部身份分配应用角色,可使用azuread_app_role_assignment资源,用法与组分配类似,只需指定用户对象ID和目标应用角色ID即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:50:04