发布 azure 函数并使用 appsettings.json

Posted

技术标签:

【中文标题】发布 azure 函数并使用 appsettings.json【英文标题】:Publish azure functions and use appsettings.json 【发布时间】:2017-08-14 12:15:36 【问题描述】:

我有一个 Azure Functions 项目,我正在使用 Visual Studio 2017 15.3 preview 7 用 C# 编写该项目。函数项目包含两个单独的函数,这两个函数都是计时器触发的。我在 appsettings.json 文件中指定了许多 appsettings,该文件设置为 Copy to the output directory on build.

当我发布 Azure Functions 项目时,这两个函数会显示在 Azure 门户中,但是它们会失败,因为它们无权访问应用程序设置。现在我知道我可以在应用程序设置刀片中指定设置,但我想使用 appsettings.json 根据这个 github 问题应该是可能的:https://github.com/Azure/azure-functions-cli/issues/33

这个 SO 答案包含一些关于让它工作的信息Azure Functions - using appsettings.json。现在问题在于“Azure 将尝试将 appsettings.json 文件查找到您正在处理的函数的根文件夹中。”我的函数项目包含以下文件结构:

-appsettings.json
-Function_function1.cs
-Function_function2.cs
-host.json

当项目构建和部署时,我最终为 wwwroot 中的每个函数创建了一个文件夹,每个函数都包含一个 function.json 文件。 appsettings.json 文件进入 wwwroot/bin 文件夹,函数无法访问。

我想如果我将函数项目更改为具有文件夹结构它将部署 appsettings.json,我将其更改为以下内容

-host.json
-Function_function1\
--Function_function1.cs
--appsettings.json
-Function_function2\
--Function_function2.cs
--appsettings.json

这没有达到我预期的结果,此时我不太确定我需要做什么才能将 appsettings 复制到 wwwroot 下的功能文件夹而不是 bin 文件夹中,任何指导将不胜感激。

【问题讨论】:

【参考方案1】:

您所指的 SO 帖子包含已弃用的信息。 appsettings.json 不再使用。

对于本地开发,您可以使用 local.settings.json 文件,但函数应用程序中不使用该文件。我刚刚完成了这个测试并验证了这个声明。

您可以在发布函数时使用--publish-local-settings 标志来获取函数应用中的设置。不过,这当然不是你想要的。

我自己也在寻找不涉及创建 ARM 模板的解决方案,但我觉得目前这是不可能的。 您当然可以编写自己的 PowerShell 脚本并以这种方式设置应用程序设置,但这更糟。

可能不是您真正想要的答案,但它是(目前)最好的答案。

【讨论】:

我相信这是正确的——我们已经走上了这条路,使用 ARM 模板来填充我们功能应用程序的应用程序设置。然后设置 VSTS 构建以在我们提交对实际功能代码的更改时更新这些应用程序。它对我们来说已经足够好用了 - 但同意一个替代方案会很好,所以很想听听是否有一个。 很遗憾事情发生了变化,它不会自动使用 appsettings.json。您应该能够做到的另一种方法是使用 Azure Powershell 命令行开关“Set-​Azure​Website”和 set-appsettings,这将存储您在标准应用程序设置部分中指定的设置,尽管连接了 set-azurewebsite拿起 appsettings.json 需要更多的工作。 这里是一个 GitHub 功能请求,您可以分享 cmets 关于更简单的方法来管理 Function App 设置:github.com/Azure/azure-functions-cli/issues/339 这是对之前更新的后续Azure Functions CLI,它使我们能够部署设置(而不是二进制文件):github.com/Azure/azure-functions-cli/issues/157【参考方案2】:

在 Azure Functions 中,设置存储在 local.setting.json 中(如果您的解决方案中不存在此文件,则创建此文件/名称应与上述完全相同)。

示例 local.settings.json 正文,


  "IsEncrypted": false,
  "Values": 
    "email": "email@server.com",
    "pass": "pass"
  ,
  "ConnectionStrings": 
    "SqlConnectionString": "server=jongdb;user=jong;"
  

添加设置文件后,您必须在 Run() 方法下对其进行配置,如下所述,

var config = new ConfigurationBuilder().SetBasePath(context.FunctionAppDirectory)
                .AddJsonFile("local.settings.json", optional: false, reloadOnChange: true).AddEnvironmentVariables().Build();

访问设置时,在下方使用

IConfigurationRoot config;
config["fromEmail"];

使用以下命令发布设置

func azure functionapp publish *YourAppName* --publish-local-settings -i

部署完成后,您将在 Azure 门户中的应用程序设置下看到设置(查看下图)

必填, 需要在您的计算机中安装 Azure CLI,

Download

【讨论】:

在 VS Code 中,如果您有 Azure 扩展,您只需在导航窗格中右键单击您的函数并上传本地设置。 您可能希望 optional:false 为真,因为除非在本地开发机器上,否则本地设置文件不应按设计位于输出/函数文件夹中。那么它不会在天蓝色中失败吗? --publish-local-settings 标志会将开发应用程序设置作为生产值发送到 azure,这些值会由您包含的 .AddEnvironmentVariables() 调用获取。

以上是关于发布 azure 函数并使用 appsettings.json的主要内容,如果未能解决你的问题,请参考以下文章

Azure Functions 不发布 appsettings.prod.json 文件

Azure DevOps 发布更改 appsettings.json 日志记录部分

如何使用 arm 模板更新 azure appsettings

如何在运行时在 Blazor WebAssembly 客户端应用程序中使用 Azure 应用设置作为 appsettings.json 配置?

ARM - 如何从存储帐户获取访问密钥,以便稍后在模板中的 AppSettings 中使用?

将 appsettings.json 文件中的机密存储在 Azure Key Vault 上的 .Net 控制台应用程序中