根据环境使用具有不同存储帐户的 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 环境中定义每个设置的值。请注意,AzureWebJobsStorage
和 AzureWebJobsDashboard
的值是根据您在创建函数时选择的存储帐户自动设置的。
定义设置的最简单方法是通过 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 事件中心存储容器配置
Powershell:将所有具有“NetworkRuleSet”属性的 Azure 存储帐户列出/导出到 CSV