根据环境使用具有不同存储帐户的 Azure Functions

Posted

技术标签:

【中文标题】根据环境使用具有不同存储帐户的 Azure Functions【英文标题】:Using Azure Functions with a different storage account depending on environment 【发布时间】:2018-08-10 06:09:33 【问题描述】:

我目前正在设置一个多发布者/单订阅者架构,使用 Azure 存储队列来缓冲事件并使用 Azure Functions 作为订阅者。

Publisher -> Queue -> Function

创建函数没问题,我正在努力解决的部分是如何设置相同函数的开发和生产部署。我在 Visual Studio 中创建了函数,连接是一个常量字符串:

public static class FooAdded

    [FunctionName("FooAdded")]
    public static void Run([QueueTrigger("tracker-readings", Connection = "https://foo.queue.core.windows.net/?sv=...")]string myQueueItem, TraceWriter log)
    
        log.Info($"C# Queue trigger function processed: myQueueItem");
    

如何为连接提供不同的值,具体取决于我是部署到开发环境还是实时环境?

【问题讨论】:

【参考方案1】:

设置本地调试环境

您可以使用local.settings.json 文件来定义本地设置。在本地使用 Azure 存储的先决条件是您需要在您的计算机上运行 Azure Storage Emulator。在local.settings.json 文件中,将Azure Storage Account 连接字符串定义为UseDevelopmentStorage=true。该文件应如下所示:


  "IsEncrypted": false,
  "Values": 
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true"
  

默认情况下,如果没有为QueueTrigger 属性的Connection 属性提供值,它将使用AzureWebJobsStorage 设置:

public static class FooAdded

    [FunctionName("FooAdded")]
    public static void Run([QueueTrigger("tracker-readings")]string myQueueItem, TraceWriter log)
    
        log.Info($"C# Queue trigger function processed: myQueueItem");
    

或者,如果你想明确指定一个连接字符串,那么你可以将Connection设置为连接字符串的名称(不是连接字符串本身),并添加一个条目它在配置文件的Values 部分:

QueueTrigger("tracker-readings", Connection = "CustomConnection")

在local.settings.json 文件中:


  "IsEncrypted": false,
  "Values": 
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
    "CustomConnection": "Some custom connection string"
  

更多详情请参考官方文档:

Develop and run Azure functions locally App settings reference

设置 Azure 环境:

local.settings.json 中的值不会发布到 Azure,因此需要在要部署到的 Azure 环境中定义每个设置的值。请注意,AzureWebJobsStorageAzureWebJobsDashboard 的值是根据您在创建函数时选择的存储帐户自动设置的。

定义设置的最简单方法是通过 Azure 门户。转到Function App 中的应用程序设置并定义存储帐户连接字符串的实际值。您无需对 azure 函数进行任何代码更改,它会自动从应用程序设置中获取连接字符串。

或者,您可以使用Azure Resource Manager templates,以编程方式部署和更新环境设置。

您在 Azure 中创建的每个函数应用都有自己的环境,因此在为相关设置提供值后,您可以将函数部署到 Azure 中的多个环境(开发/测试/生产等)以及在本地调试代码无需每次都更改连接字符串。

【讨论】:

我不知道连接字符串默认为AzureWebJobsStorage 的值,我认为必须为其提供一个值。感谢您花时间写出如此完整的答案,希望这对以后的其他人有所帮助。 谨慎使用 ARM 模板部署带有 appsettings 的 azure 函数。 ARM 模板删除所有应用程序设置并将其替换为 ARM 模板中的设置。 github.com/Azure/azure-cli/issues/11718***.com/questions/59383303/…【参考方案2】:

在环境变量(或应用服务中的应用设置)中包含连接字符串。然后,您可以在不同的环境中将应用设置设置为不同的值。

【讨论】:

【参考方案3】:

我正在努力解决的是如何设置相同功能的开发和生产部署。

我不清楚你为什么要创建一个既作为生产又作为开发的函数。

实际上,Azure 计费是基于你的应用服务计划,所以你再创建一个 azure 功能可能不会花费更多。您可以创建两个函数来更清楚地区分它们

如果你仍然想使用单个功能,正如 Travis 所说,你可以在应用设置中为不同的环境设置两个连接字符串。

【讨论】:

一个功能,两个部署。 Shivkanwer 非常彻底地回答了这种情况【参考方案4】:

这是一个众所周知的场景并得到完全支持。您只需使用 ARM 模板和参数文件来管理您的部署。

Deploy resources with Resource Manager templates and Azure PowerShell

连接字符串以及任何其他子/资源组相关设置只是参数。

【讨论】:

【参考方案5】:

您可以将 Connection 设置为一个配置值(例如 Connection=AppSettingsKey.DatabaseConnectionString),然后针对不同的平台(dev、staging、prod)进行不同的设置。

根据您的构建和部署工具,您可以在其中一个步骤中为连接字符串注入配置值。

另一种选择是使用存储连接字符串的 Keyvault 机密。

【讨论】:

以上是关于根据环境使用具有不同存储帐户的 Azure Functions的主要内容,如果未能解决你的问题,请参考以下文章

具有输入绑定的 Azure 函数的 Azure 事件中心存储容器配置

使用 ARM 模板对 Azure 存储帐户容器设置合法保留

如何使用不同的帐户将存储容器添加到 Azure?

Powershell:将所有具有“NetworkRuleSet”属性的 Azure 存储帐户列出/导出到 CSV

Azure Web App VNet 与具有专用链接的存储帐户集成

如何获取 Azure 存储帐户密钥