首页 > 解决方案 > 由 servicebus 触发的 Azure Functions 抱怨连接字符串“AzureWebJobsServiceBus”丢失或为空

问题描述

当我在 local.settings.json 中有一个有效的 AzureWebJobsServiceBus 时,我有一个 .netcore Azure Functions 项目在 Visual Studio 2019 中运行良好,但如果它丢失或为空,则无法编译。我正在使用 AD 向服务总线验证我的功能,而不是通过连接字符串。AzureWebJobsServiceBus 在我的项目中的任何地方都没有使用。这是我的 project.cs

在此处输入图像描述

我使用 Azure.Identity 包并按照这篇文章使用我的凭据登录到 Azure,这是我正在工作的函数:

    [FunctionName("ProcessNewMessage")]
    public async Task ProcessPaymentMessage([ServiceBusTrigger("topic", "subscription")] Message message, ILogger log) {
        var tokenProvider = TokenProvider.CreateManagedIdentityTokenProvider();
        QueueClient queueClient = new QueueClient($"sb://{Environment.GetEnvironmentVariable("ServiceBusEndPoint")}", Environment.GetEnvironmentVariable("GenericAuditQueueName"), tokenProvider);

        await queueClient.SendAsync(message);
    }

在使用 AD 进行身份验证之前,我使用的是连接字符串,这也可以,但建议使用 AD。

总而言之,当提供连接字符串但我的代码未使用时,我的 Azure 函数与服务总线触发器一起使用。如何在没有连接字符串的情况下使我的函数与 AD 一起使用?

非常感谢

标签: azure-active-directoryazure-functionsazureservicebus

解决方案


您无法从 Azure 函数应用服务总线触发器中删除服务总线连接字符串,因为内部 SDK 使用它来建立连接。

使用 key Vault 在 Function App 中保存服务总线的连接字符串: Key Vault 引用功能使您的应用程序可以像使用应用程序设置一样工作,这意味着不需要更改代码。您可以从我们的Key Vault 参考文档中获取所有详细信息,但我将在此处概述基础知识。

此功能需要为您的应用分配系统分配的托管标识。在这篇文章的后面,我将讨论用户分配的身份,但我们暂时将这些预览分开。

然后,您需要在 Key Vault 上配置访问策略,为您的应用程序提供获取机密的权限。了解如何配置访问策略

最后,将任何应用程序设置的值设置为以下格式的引用:

@Microsoft.KeyVault(SecretUri=secret_uri_with_version)

其中 secret_uri_with_version 是 Key Vault 中机密的完整 URI。例如,这将类似于:https ://myvault.vault.azure.net/secrets/azurewebjobsservicebussecret/ec96f02080254f109c51a1f14cdb1931

在此处输入图像描述

您可以将 MSI 用于 Azure Function App 和服务总线:

函数应用程序的 MSI: https ://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=dotnet#add-a-system-assigned-identity

服务总线的 MSI: https ://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-managed-service-identity#use-service-bus-with-managed-identities-for -天蓝色资源


推荐阅读