【问题标题】:Updating appsettings.json values from KeyVault in Azure Function从 Azure 函数中的 KeyVault 更新 appsettings.json 值
【发布时间】:2022-11-24 14:46:24
【问题描述】:

我在使用 Startup 类的 Azure Function 中使用 appsettings 文件。在我的 appsettings 文件中,有 keyvault 引用。但我似乎无法让它工作,因为 keyvault 引用永远不会被 keyvault 中的实际字符串替换。我究竟做错了什么?我的示例使用客户端 ID 和密码,因为我需要在本地进行测试,但会切换到使用 Prod 中的托管身份。

启动有以下功能:

        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        {
            try
            {
                FunctionsHostBuilderContext context = builder.GetContext();

                var configurationBuilder = builder.ConfigurationBuilder
                    .SetBasePath(context.ApplicationRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile("appsettings.Production.json", optional: true, reloadOnChange: true)
                    .AddEnvironmentVariables()
                    .Build();

                builder.ConfigurationBuilder
                    .SetBasePath(context.ApplicationRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile("appsettings.Production.json", optional: true, reloadOnChange: true)
                    .AddEnvironmentVariables()
                    .AddAzureKeyVault(configurationBuilder["vaultUri"], "<clientid>", "<clientsecret>");
            } catch (Exception e)
            {
                throw new Exception(e.StackTrace + " " + e.Message);
            }
        }

但是,即使在使用“AddAzureKeyVault”方法之后,配置对象仍然具有 keyvault 引用字符串。我究竟做错了什么?

我的 appsettings 文件看起来像这样

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
  },
  "MySection": {
    "MyUrl": "@Microsoft.KeyVault(SecretUri=https://mykv.vault.azure.net/secrets/MySection-MyUrl/)"
  },
  "vaultUri": "https://mykv.vault.azure.net/"
}

MyUrl 密钥不应该使用密钥库中的实际值进行更新吗?

更新:所以我意识到我为 Keyvault 使用了错误的 nuget pacakge。所以改用 Azure.Extensions.AspNetCore.Configuration.Secrets。代码现在更改为使用托管标识。但是不知何故,这些值仍然没有更新:(

        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        {
            try
            {
                FunctionsHostBuilderContext context = builder.GetContext();

                var configurationBuilder = builder.ConfigurationBuilder
                    .SetBasePath(context.ApplicationRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile("appsettings.Production.json", optional: true, reloadOnChange: true)
                    .AddEnvironmentVariables()
                    .Build();

                string userAssignedClientId = configurationBuilder["userAssignedClientId"];
                var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId });

                var options = new AzureKeyVaultConfigurationOptions { ReloadInterval = TimeSpan.FromHours(24) };

                builder.ConfigurationBuilder
                    .SetBasePath(context.ApplicationRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile("appsettings.Production.json", optional: true, reloadOnChange: true)
                    .AddAzureKeyVault(new Uri(configurationBuilder["vaultUri"]), credential, options)
                    .Build();
            } catch (Exception e)
            {
                throw new Exception(e.StackTrace + " " + e.Message);
            }
        }

【问题讨论】:

    标签: azure azure-functions azure-keyvault


    【解决方案1】:

    这是因为你是:

    1. 未正确使用应用设置 keyvault 引用——它们必须在应用服务的应用配置部分中设置,不是在配置文件中。
    2. 尝试将应用程序设置引用与直接应用程序 keyvault 集成相结合。你只需要两者之一,而不是两者。

      基本上,删除这个:

        "MySection": {
          "MyUrl": "@Microsoft.KeyVault(SecretUri=https://mykv.vault.azure.net/secrets/MySection-MyUrl/)"
        }
      

      它没有从 keyvault 加载秘密,因为你已经定义了价值.

      此外,就其价值而言,这段代码没有做任何有用的事情,应该被删除:

      catch (Exception e)
      {
          throw new Exception(e.StackTrace + " " + e.Message);
      }
      

      您捕获的异常已经有堆栈跟踪和消息。您没有完成任何稍微重新格式化内容并抛出新异常的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多