Azure 函数 - 从 Azure 密钥保管库获取服务总线连接字符串

Posted

技术标签:

【中文标题】Azure 函数 - 从 Azure 密钥保管库获取服务总线连接字符串【英文标题】:Azure Function - Get service bus connection string from Azure key vault 【发布时间】:2020-02-18 19:25:02 【问题描述】:

我有一个在 docker 容器中运行的 Azure 函数。此功能需要使用 Azure 服务总线。所以我的函数是使用属性“ServiceBusAccount”来获取服务总线连接字符串

    [FunctionName("MyFunc")]
    [ServiceBusAccount("ServiceBusConnectionString")]
    public async Task MyFunc(...)
    ...

在配置生成器中,我运行以下代码从 Azure Key Vault 获取一些值(包括服务总线连接字符串):

     var configBuilder = new ConfigurationBuilder();

     var config = configBuilder.AddAzureKeyVault($"https://config["keyVaultName"].vault.azure.net", config["keyVaultClientId"], config["keyVaultSecret"])
                .Build();

问题是,当主机启动时,我首先收到警告:

“警告:找不到名为 'ServiceBusConnectionString' 的值”

然后在我的函数被发现后,我得到了这个错误:

发生主机错误。 Microsoft.Azure.WebJobs.ServiceBus:Microsoft Azure WebJobs SDK ServiceBus 连接字符串“ServiceBusConnectionString”丢失或为空

我的理解是宿主环境甚至在启动函数之前以及在项目的启动类中调用配置生成器之前,都试图获取服务总线连接字符串。

有没有办法在运行时设置服务总线连接字符串?

编辑

如果你使用 Azure DevOps,这应该有助于解决这个问题https://daniel-krzyczkowski.github.io/How-to-inject-Azure-Key-Vault-secrets-in-the-Azure-DevOps-CICD-pipelines/

【问题讨论】:

您是在使用 servicebus 触发功能还是在使用 servicebus 的其他类型的触发功能? 我正在使用服务总线触发功能。如果我将服务总线连接字符串放在我的 local.settings.json 中,一切都很好。当我从那里删除它并在运行时从 Azure Key Vault 中提取连接字符串时,我收到了上面提到的错误。 【参考方案1】:

您可以在函数中将@Microsoft.KeyVault(SecretUri=Secret URI with version) 设置为Application Setting

1.开启你的Azure函数Identity

2.转到 Key Vault 的 Access Control 部分,然后单击添加角色分配刀片,将角色分配给函数的服务主体。

3. 转到您的 Key Vault 并单击 Access Policies,然后单击将策略添加到具有密钥或秘密权限的函数的服务主体。

4.在 Azure Function 中使用 Key Vault Secret。

更多详情可以参考这个article。

【讨论】:

我的函数在容器中运行。它们不在 Azure 门户上。因此我猜你的解决方案不可行 @AlessandroLallo 你能找到一个可行的解决方案吗?我遇到了同样的问题。 @tubakaya 如果你正在使用 Azure DevOps,这应该有助于daniel-krzyczkowski.github.io/… @AlessandroLallo 感谢您的回复。我已经有一个可以在构建期间替换 appsettings 的实现。正如您的问题所暗示的那样,我正在寻找一种根本没有 appsettings 设置的方法,而是在启动期间指示服务总线连接字符串。

以上是关于Azure 函数 - 从 Azure 密钥保管库获取服务总线连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何读取存储在 Azure 密钥保管库中的值/秘密

密钥保管库上的 Azure 自签名证书

如何使用托管在本地 IIS 上的 Web 应用从 Azure 密钥保管库访问 web.config 中的应用设置和连接字符串等机密

由于自签名 CA,访问 Azure 密钥保管库错误

Azure 密钥保管库加密

Azure 磁盘加密 - 通过带有密钥保管库的 Terraform - VmExtensionProvisioningError