【问题标题】:Using Azure Functions with a different storage account depending on environment根据环境使用具有不同存储帐户的 Azure Functions
【发布时间】: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}");
    }
}

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

【问题讨论】:

    标签: c# azure azure-functions azure-storage-queues


    【解决方案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"
      }
    }
    

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

    设置 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/11718stackoverflow.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 机密。

        【讨论】:

          猜你喜欢
          • 2018-09-26
          • 1970-01-01
          • 2019-09-28
          • 1970-01-01
          • 1970-01-01
          • 2017-07-15
          • 2019-04-06
          • 2019-03-06
          • 1970-01-01
          相关资源
          最近更新 更多