如何自动映射Key Vault中的Azure Functions机密

dar*_*eck 5 azure azure-keyvault azure-functions

我想知道是否可以初始化队列触发器甚至blob触发从azure Vault读取的连接字符串.

现在,我们必须通过刀片属性通过环境设置来设置这些数据连接.但是,我想只使用服务主体来检索azure密钥保险库的令牌以获取所有这些连接字符串.

我正在试图弄清楚如何在java中使用它.

谢谢,德里克

Tho*_*mas 9

此功能在此处进行跟踪和处理:

编辑28/11/2018:目前正在预览中

前回答07/10/2018 此解决方案不适用于使用消费计划的触发器.

与此同时,我对您的问题进行了一些研究,如果您使用Azure Function v2,则可以从密钥保险库中读取配置.

我从Visual Studio创建了Azure Functions v2(.NET Standard).

它用:

  • NETStandard.Library v2.0.3
  • Microsoft.NET.Sdk.Functions v1.0.22
  • Microsoft.Azure.WebJobs v3.0.0
  • Microsoft.Azure.WebJobs.Extensions.Storage v3.0.0

因为Azure Functions v2使用ASP.NET核心,所以我能够引用此链接来配置我的功能应用程序以使用Azure Key Vault:

ASP.NET Core中的Azure Key Vault配置提供程序

  1. 我添加了这个nuget包:

我已将我的应用配置为使用此nuget包:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;

[assembly: WebJobsStartup(typeof(FunctionApp1.WebJobsExtensionStartup), "A Web Jobs Extension Sample")]
namespace FunctionApp1
{
    public class WebJobsExtensionStartup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            // Gets the default configuration
            var serviceConfig = builder.Services.FirstOrDefault(s => s.ServiceType.Equals(typeof(IConfiguration)));
            var rootConfig = (IConfiguration)serviceConfig.ImplementationInstance;

            // Creates a new config based on the default one and adds the keyvault configuration builder
            var keyvaultName = rootConfig["keyVaultName"];
            var config = new ConfigurationBuilder()
                .AddConfiguration(rootConfig).AddAzureKeyVault($"https://{keyvaultName}.vault.azure.net/").Build();

            // Replace the existing config
            builder.Services.AddSingleton<IConfiguration>(config);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的Azure功能使用MSI:

Azure功能 - 托管服务标识

我已经为我的密钥保险库上的功能应用授予了读/列密码权限:

我有一个小队列触发函数:

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([QueueTrigger("%queueName%", Connection = "queueConnectionString")]string myQueueItem, ILogger log)
    {
        log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    }
}
Run Code Online (Sandbox Code Playgroud)

queueName是在定义local.settings.json文件(应用程序设置刀片一旦部署):

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "keyVaultName": "thomastestkv",
    "queueName": "myqueue"
  }
}
Run Code Online (Sandbox Code Playgroud)

queueConnectionString配置在我keyvault:

Azure Key Vault  - 秘密

  • 请注意,在消费计划中运行时,此方法不起作用.由监视触发器并确定何时运行应用程序的azure函数运行的基础结构将无法查看服务总线并决定何时扩展应用程序.上面链接的一些github问题指向功能中发生的更多工作以更好地支持这种情况. (2认同)