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类型的主体,自然会触发类型不合法的报错。
修正步骤
- 先在现有配置里新增服务主体资源,关联你创建的应用注册
# 为应用注册创建对应服务主体 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] } - 修改角色分配配置里的
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,是应用的全局唯一标识,用来做登录、关联服务主体用,不能直接当角色分配的主体IDazuread_application.eventhub_auth.object_id是应用注册本身在Azure AD里的对象ID,属于Application类型主体,不支持RBAC绑定azuread_service_principal.eventhub_auth.object_id是服务主体的对象ID,属于ServicePrincipal类型,是Azure RBAC支持的合法主体类型
- 如果之前手动在控制台给应用注册分配过角色,本质上后台也是自动找到对应服务主体做的绑定,不是直接绑在应用注册对象上。
内容的提问来源于stack exchange,提问作者CJW
相关产品推荐
相关产品推荐

