Azure Functions 持续部署如何处理特定于环境的转换?
How does Azure Function Continuous Deployment handle environment-specific transforms?
我有一组函数,其中一些函数需要特定于环境的连接到事件中心,即函数应用程序 A 连接到事件中心 A,函数应用程序 B 连接到事件中心 B。鉴于 CD 模型使用每个环境的分支,我如何维护驱动该集成的 function.json 的单独副本?
愚蠢的答案显然是在每个分支上维护 function.json 的单独副本。这很愚蠢,因为那意味着 "be really careful not to accidentally merge over top of your environment-specific copy and be really sorry when you forget"。理想情况下,应该有类似维护环境特定副本的东西,比如 function.DEV.json 和 function.QA.json。但事实并非如此。
我的 function.json 看起来像这样:
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "iot-e1-ehub-dev-deviceevents-01",
"connection": "iot-e1-ehub-dev-deviceevents-01_iothubroutes_iot-e1-iot-dev-01_EVENTHUB"
}
],
"disabled": false
}
因此,对于每个环境,这些路径和连接元素需要不同。如果有一种方法可以在 function.json 之外管理该绑定,我不知道。
有更好的解决方案吗?
更好的解决方案是将事件中心的参数保留在应用程序设置中,并将这些设置的名称放在 function.json
中,而不要对其进行转换。
因此,您应该将 function.json
定义为
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "%eventHubPath%",
"connection": "eventHubConnection"
}
],
"disabled": false
}
然后在门户应用程序设置/连接字符串中定义 eventHubPath
和 eventHubConnection
(如果您使用的是本地环境,则定义 local.settings.json
)。
更改为使用应用程序设置,从 function.json
的角度来看,它看起来像这样:
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "%MyIotHubPath%",
"connection": "MyIotHubConnection"
}
],
"disabled": false
}
在这种情况下,connection
已经解析了一个命名的连接字符串,因此不需要在那里使用变量语法。但是,对于 path
,您需要使用显式变量语法(即 %
s)。
然后您只需根据环境更改 MyIotHubPath
(应用程序设置)和 MyIotHubConnection
(连接字符串设置)的配置值。
我有一组函数,其中一些函数需要特定于环境的连接到事件中心,即函数应用程序 A 连接到事件中心 A,函数应用程序 B 连接到事件中心 B。鉴于 CD 模型使用每个环境的分支,我如何维护驱动该集成的 function.json 的单独副本?
愚蠢的答案显然是在每个分支上维护 function.json 的单独副本。这很愚蠢,因为那意味着 "be really careful not to accidentally merge over top of your environment-specific copy and be really sorry when you forget"。理想情况下,应该有类似维护环境特定副本的东西,比如 function.DEV.json 和 function.QA.json。但事实并非如此。
我的 function.json 看起来像这样:
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "iot-e1-ehub-dev-deviceevents-01",
"connection": "iot-e1-ehub-dev-deviceevents-01_iothubroutes_iot-e1-iot-dev-01_EVENTHUB"
}
],
"disabled": false
}
因此,对于每个环境,这些路径和连接元素需要不同。如果有一种方法可以在 function.json 之外管理该绑定,我不知道。
有更好的解决方案吗?
更好的解决方案是将事件中心的参数保留在应用程序设置中,并将这些设置的名称放在 function.json
中,而不要对其进行转换。
因此,您应该将 function.json
定义为
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "%eventHubPath%",
"connection": "eventHubConnection"
}
],
"disabled": false
}
然后在门户应用程序设置/连接字符串中定义 eventHubPath
和 eventHubConnection
(如果您使用的是本地环境,则定义 local.settings.json
)。
更改为使用应用程序设置,从 function.json
的角度来看,它看起来像这样:
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "%MyIotHubPath%",
"connection": "MyIotHubConnection"
}
],
"disabled": false
}
在这种情况下,connection
已经解析了一个命名的连接字符串,因此不需要在那里使用变量语法。但是,对于 path
,您需要使用显式变量语法(即 %
s)。
然后您只需根据环境更改 MyIotHubPath
(应用程序设置)和 MyIotHubConnection
(连接字符串设置)的配置值。