You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:45:50