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

Terraform分配Azure事件中心角色报Application类型主体无效

问题:Terraform分配Azure角色时报错「Principals of type Application cannot validly be used in role assignments」

问题背景

通过Terraform部署Azure App Registration(应用注册)后,需要为该应用分配Event Hub(事件中心)的对应数据操作角色,执行配置时触发上述报错。

现有App Registration部署配置

data "azuread_client_config" "current" {}

resource "azuread_application" "eventhub_auth" {
  display_name     = "AppReg"
  sign_in_audience = "AzureADMyOrg"
  owners           = [data.azuread_client_config.current.object_id]

  app_role {
    allowed_member_types = ["User", "Application"]
    description          = "Admins can manage roles and perform all task actions"
    display_name         = "Admin"
    enabled              = true
    id                   = uuid()
    value                = "admin"
  }

  app_role {
    allowed_member_types = ["User"]
    description          = "ReadOnly roles have limited query access"
    display_name         = "ReadOnly"
    enabled              = true
    id                   = uuid()
    value                = "User"
  }
}

现有角色分配配置

resource "azurerm_role_assignment" "receiver" {
  scope                = resource.azurerm_eventhub_namespace.hub.id
  role_definition_name = "Azure Event Hubs Data Receiver"
  principal_id         = # 已尝试填入Object_ID、Application_ID、Tenant_ID,均触发报错
}

核心疑问:是否遗漏了Service Principal(服务主体)的创建?principal_id参数应该传入哪个有效ID?


解决方案

你的判断完全正确,Azure的RBAC角色分配不支持直接绑定到Application(应用注册)对象,必须绑定到应用注册对应的Service Principal(服务主体)对象。
Azure AD里的应用注册是全局的应用身份定义,真正用来在具体租户/订阅内做权限分配、身份认证的实体是和应用注册1:1关联的服务主体,你之前试的应用ID、应用注册本身的对象ID都是Application类型的主体,自然会触发类型不合法的报错。

修正步骤

  1. 先在现有配置里新增服务主体资源,关联你创建的应用注册
    # 为应用注册创建对应服务主体
    resource "azuread_service_principal" "eventhub_auth" {
      client_id                    = azuread_application.eventhub_auth.client_id
      app_role_assignment_required = false
      owners                       = [data.azuread_client_config.current.object_id]
    }
    
  2. 修改角色分配配置里的principal_id,传入服务主体的对象ID即可
    resource "azurerm_role_assignment" "receiver" {
      scope                = resource.azurerm_eventhub_namespace.hub.id
      role_definition_name = "Azure Event Hubs Data Receiver"
      # 注意这里要传服务主体的object_id,不是应用注册的ID
      principal_id         = azuread_service_principal.eventhub_auth.object_id
    }
    

注意点

  • 不要混淆几个ID的用途:
    • azuread_application.eventhub_auth.client_id 也就是常说的Application ID,是应用的全局唯一标识,用来做登录、关联服务主体用,不能直接当角色分配的主体ID
    • azuread_application.eventhub_auth.object_id 是应用注册本身在Azure AD里的对象ID,属于Application类型主体,不支持RBAC绑定
    • azuread_service_principal.eventhub_auth.object_id 是服务主体的对象ID,属于ServicePrincipal类型,是Azure RBAC支持的合法主体类型
  • 如果之前手动在控制台给应用注册分配过角色,本质上后台也是自动找到对应服务主体做的绑定,不是直接绑在应用注册对象上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:15:59