根据环境使用具有不同存储帐户的 Azure Functions
Using Azure Functions with a different storage account depending on environment
我目前正在设置多个 publisher/single 订阅者架构,使用 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}");
}
}
如何根据部署到开发环境或实时环境为连接提供不同的值?
在环境变量(或应用服务中的应用设置)中有连接字符串。然后,您可以在不同的环境中将应用设置设置为不同的值。
I am trying to work out is how to set up a development and a production deployment of the same function.
我不清楚你为什么要创建一个既作为生产又作为开发的功能。
实际上,Azure 计费是基于您的应用服务计划,因此您再创建一个 azure 函数可能不会花费更多。您可以创建两个函数来更清楚地区分它们。
如果您仍然想使用单个功能,如 Travis 所说,您可以在应用程序设置中为不同的环境设置两个连接字符串。
这是一个众所周知的场景并得到完全支持。您只需使用 ARM 模板和参数文件来管理您的部署。
Deploy resources with Resource Manager templates and Azure PowerShell
连接字符串以及任何其他 Sub/Resource 组相关设置只是参数。
您可以将连接设置为配置值(类似于 Connection=AppSettingsKey.DatabaseConnectionString
),然后针对不同的平台(开发、暂存、生产)进行不同的设置。
根据您的构建和部署工具,您可以在其中一个步骤中为连接字符串注入配置值。
另一种选择是使用存储连接字符串的 Keyvault 机密。
设置本地调试环境
您可以使用 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
设置为连接字符串的 name(不是连接字符串本身),并在配置文件的 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 环境中定义每个设置的值。请注意,AzureWebJobsStorage
和 AzureWebJobsDashboard
的值是根据您在创建函数时选择的存储帐户自动设置的。
定义设置的最简单方法是通过 Azure 门户。转到 Function App
中的应用程序设置并定义存储帐户连接字符串的实际值。您无需对 azure 函数进行任何代码更改,它会自动从应用程序设置中获取连接字符串。
或者,您可以使用 Azure Resource Manager templates,以编程方式部署和更新环境设置。
您在 Azure 中创建的每个函数应用程序都有自己的环境,因此在为相关设置提供值后,您可以将您的函数部署到 Azure 中的多个环境(Dev/Test/Prod 等)以及调试您的在本地编写代码,而无需每次都更改连接字符串。
我目前正在设置多个 publisher/single 订阅者架构,使用 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}");
}
}
如何根据部署到开发环境或实时环境为连接提供不同的值?
在环境变量(或应用服务中的应用设置)中有连接字符串。然后,您可以在不同的环境中将应用设置设置为不同的值。
I am trying to work out is how to set up a development and a production deployment of the same function.
我不清楚你为什么要创建一个既作为生产又作为开发的功能。
实际上,Azure 计费是基于您的应用服务计划,因此您再创建一个 azure 函数可能不会花费更多。您可以创建两个函数来更清楚地区分它们。
如果您仍然想使用单个功能,如 Travis 所说,您可以在应用程序设置中为不同的环境设置两个连接字符串。
这是一个众所周知的场景并得到完全支持。您只需使用 ARM 模板和参数文件来管理您的部署。
Deploy resources with Resource Manager templates and Azure PowerShell
连接字符串以及任何其他 Sub/Resource 组相关设置只是参数。
您可以将连接设置为配置值(类似于 Connection=AppSettingsKey.DatabaseConnectionString
),然后针对不同的平台(开发、暂存、生产)进行不同的设置。
根据您的构建和部署工具,您可以在其中一个步骤中为连接字符串注入配置值。
另一种选择是使用存储连接字符串的 Keyvault 机密。
设置本地调试环境
您可以使用 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
设置为连接字符串的 name(不是连接字符串本身),并在配置文件的 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 环境中定义每个设置的值。请注意,AzureWebJobsStorage
和 AzureWebJobsDashboard
的值是根据您在创建函数时选择的存储帐户自动设置的。
定义设置的最简单方法是通过 Azure 门户。转到 Function App
中的应用程序设置并定义存储帐户连接字符串的实际值。您无需对 azure 函数进行任何代码更改,它会自动从应用程序设置中获取连接字符串。
或者,您可以使用 Azure Resource Manager templates,以编程方式部署和更新环境设置。
您在 Azure 中创建的每个函数应用程序都有自己的环境,因此在为相关设置提供值后,您可以将您的函数部署到 Azure 中的多个环境(Dev/Test/Prod 等)以及调试您的在本地编写代码,而无需每次都更改连接字符串。