我正在尝试使用 Bicep 将 RBAC 角色“Azure 服务总线数据接收器”分配给函数应用程序的 Azure 服务总线队列。之前我已经用存储帐户队列完成了这项工作,但这现在给我的服务总线队列带来了一些问题。
到目前为止,这是我的二头肌:
var globalServiceBusName = 'sbns-global-nonprod'
var globalServiceBusQueueName = 'sbq-queue01'
resource serviceBusReceiverRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
scope: subscription()
name: '4f6d3b9b-027b-4f4c-9142-0e5a2a2247e0' // Azure Service Bus Data Receiver
}
// Get a reference to a Service Bus in another Resource Group
resource globalServiceBus 'Microsoft.ServiceBus/namespaces@2021-11-01' existing = {
name: globalServiceBusName
}
// Get a reference to a Service Bus Queue in another Resource Group
resource globalServiceBusQueue 'Microsoft.ServiceBus/namespaces/queues@2022-10-01-preview' existing = {
parent: globalServiceBus
name: globalServiceBusQueueName
}
// Assign RBAC role 'Azure Service Bus Data Receiver' to the Service Bus queue
resource RBACAzureServiceBusDataReceiver 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(resourceGroup().id, functionApp.id, globalServiceBusQueue.id, serviceBusReceiverRoleDefinition.id)
scope: globalServiceBusQueue
properties: {
principalId: functionApp.identity.principalId
roleDefinitionId: serviceBusReceiverRoleDefinition.id
principalType: 'ServicePrincipal'
}
}
ARM 验证正常,但在部署时出现错误:
“无法对嵌套资源执行请求的操作。找不到父资源‘sbns-global-nonprod’。”
当我用“globalServiceBus.name”输出资源 globalServiceBus 的名称和用“globalServiceBusQueue.name”输出 globalServiceBusQueue 时,我可以看到实际名称,这意味着 Bicep 对它们有引用。
编辑:当我将服务总线及其队列移动到我的函数应用程序所在的同一资源组时,此代码有效。所以所有资源都在1个RG中。然后就可以了。我的愿望是拥有 1 个共享 RG,其中可以放置共享资源,例如 Premium Tier 中的服务总线,它可以被队列接收者使用,例如来自其他 RG 的 Function App。
引用不同资源组中的现有资源时,可以指定
scope
属性:
resource globalServiceBus 'Microsoft.ServiceBus/namespaces@2021-11-01' existing = {
scope: resourceGroup('<service-bus-resourcegroup-name>')
name: globalServiceBusName
}
如果资源在不同的订阅中,
resourceGroup
函数还支持传递 subscriptionId:
resource globalServiceBus 'Microsoft.ServiceBus/namespaces@2021-11-01' existing = {
scope: resourceGroup('<service-bus-subscriptionId>', '<service-bus-resourcegroup-name>')
name: globalServiceBusName
}