使用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
相关产品推荐
相关产品推荐

