如何在Azure Function启动配置阶段读取appsettings.json值
Azure Function 多环境动态读取Key Vault配置实现
问题场景
现有Azure Function应用逻辑为读取appsettings.json配置,同时对接Azure Key Vault拉取机密配置替换本地明文值。初始实现中Key Vault的访问URI、用户分配托管标识的userAssignedClientId均为硬编码,无法适配多环境部署需求,需要调整Startup.cs的ConfigureAppConfiguration逻辑,从对应运行环境的appsettings.{环境名}.json中读取这两个参数。
初始Startup.cs代码如下:
using Azure.Extensions.AspNetCore.Configuration.Secrets; using Azure.Identity; using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using System.IO; [assembly: FunctionsStartup(typeof(FunctionApp3.Startup))] namespace FunctionApp3 { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddOptions<Settings>() .Configure<IConfiguration>((settings, configuration) => { configuration.GetSection("Settings").Bind(settings); }); } public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder) { FunctionsHostBuilderContext context = builder.GetContext(); // 硬编码的用户分配托管标识ID string userAssignedClientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId }); var options = new AzureKeyVaultConfigurationOptions { ReloadInterval = TimeSpan.FromHours(24) }; builder.ConfigurationBuilder .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false) .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false) .AddEnvironmentVariables() // 硬编码的Key Vault URI .AddAzureKeyVault(new Uri("https://xxxxxxxx.vault.azure.net/"), credential, options); } } }
实现方案
核心逻辑:先构建临时配置实例,加载本地json配置文件和环境变量,从中读取userAssignedClientId和KeyVaultUri参数,再用读取到的参数初始化Key Vault配置源,追加到正式配置构建管道中,实现多环境下参数自动适配。
最终调整后的Startup.cs代码如下:
using Azure.Extensions.AspNetCore.Configuration.Secrets; using Azure.Identity; using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using System.IO; [assembly: FunctionsStartup(typeof(ADX_Function.Startup))] namespace ADX_Function { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddOptions<Settings>() .Configure<IConfiguration>((settings, configuration) => { configuration.GetSection("Settings").Bind(settings); }); } public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder) { FunctionsHostBuilderContext context = builder.GetContext(); // 第一步:构建临时配置,读取本地配置和环境变量中的Key Vault连接参数 var tempConfig = builder.ConfigurationBuilder .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false) .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false) .AddEnvironmentVariables() .Build(); string userAssignedClientId = tempConfig["userAssignedClientId"]; var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId }); var options = new AzureKeyVaultConfigurationOptions { ReloadInterval = TimeSpan.FromHours(24) }; // 第二步:构建正式配置,追加Key Vault配置源 builder.ConfigurationBuilder .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false) .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false) .AddEnvironmentVariables() .AddAzureKeyVault(new Uri(tempConfig["KeyVaultUri"]), credential, options); } } }
注意:需要提前在各环境对应的
appsettings.{环境名}.json中配置userAssignedClientId和KeyVaultUri两个字段,本地开发环境也可通过环境变量配置这两个值覆盖文件配置。
内容的提问来源于stack exchange,提问作者TW_KuanLun
相关产品推荐
相关产品推荐

