如何为Azure函数的Service Bus触发器配置RBAC授权(非SAS密钥)?
已将Azure Service Bus配置为使用RBAC,并为自身分配了Azure Service Bus Data Owner角色,可通过以下代码成功向队列发送消息:
ServiceBusClient client = new ServiceBusClient("mynamespace.servicebus.windows.net", new AzureCliCredential()); ServiceBusMessage serviceBusMessage = new ServiceBusMessage("my message"); await client.CreateSender("myqueue").SendMessageAsync(serviceBusMessage);
但本地运行带有Service Bus触发器的Azure函数时出现启动失败错误,函数代码如下:
[Function(nameof(MyTrigger))] public async Task Run( [ServiceBusTrigger("myqueue", Connection = "MyServiceBusNamespace")] ServiceBusReceivedMessage message, ServiceBusMessageActions messageActions) { _logger.LogInformation("Message Body: {body}", message.Body); await messageActions.CompleteMessageAsync(message); await Task.CompletedTask; }
本地配置文件local.settings.json内容:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "AzureWebJobsSecretStorageType": "Files", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "MyServiceBusNamespace": "mynamespace.servicebus.windows.net" } }
错误信息:
[2025-02-17T17:22:14.636Z] The listener for function 'Functions.MyTrigger' was unable to start. [2025-02-17T17:22:14.636Z] The listener for function 'Functions.MyTrigger' was unable to start. Azure.Messaging.ServiceBus: The connection string could not be parsed; either it was malformed or contains no well-known tokens.
需解决:如何在Azure函数中使用基于RBAC(而非SAS密钥)的Service Bus触发器?
要让Azure Service Bus触发器使用RBAC认证,需调整配置和依赖,具体步骤如下:
修改local.settings.json连接配置
不能直接将命名空间地址作为连接值,需配置为指定身份认证的格式。将MyServiceBusNamespace的值修改为:Endpoint=sb://mynamespace.servicebus.windows.net/;Authentication=ManagedIdentity该格式会告知函数运行时使用托管身份完成认证,本地开发时自动复用Azure CLI的登录身份。
确认本地Azure CLI登录状态
本地运行函数时,会自动使用当前Azure CLI的登录身份,需确保已通过az login登录到拥有Service Bus权限的账号,且该账号已分配Azure Service Bus Data Receiver或Azure Service Bus Data Owner角色(已分配Data Owner则无需额外操作,仅需确认登录账号正确)。检查包依赖版本
对于.NET Isolated模式的函数,需确保Microsoft.Azure.Functions.Worker.Extensions.ServiceBus包版本不低于5.11.0(此版本开始支持RBAC认证)。项目文件中的依赖示例:<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus" Version="5.11.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.2" /> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.1" />多租户环境下指定租户ID(可选)
若Azure账号属于多个租户,需在local.settings.json的Values中添加AZURE_TENANT_ID配置,指定目标租户ID:"AZURE_TENANT_ID": "你的租户ID"
完成上述配置后,重新运行函数,触发器即可通过RBAC认证连接到Service Bus队列并处理消息。
内容的提问来源于stack exchange,提问作者tridy

