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
}

然后在门户应用程序设置/连接字符串中定义 eventHubPatheventHubConnection(如果您使用的是本地环境,则定义 local.settings.json)。

更改为使用应用程序设置,从 function.json 的角度来看,它看起来像这样:

{
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "myEventHubMessage",
      "direction": "in",
      "path": "%MyIotHubPath%",
      "connection": "MyIotHubConnection"
    }
  ],
  "disabled": false
}

在这种情况下,connection 已经解析了一个命名的连接字符串,因此不需要在那里使用变量语法。但是,对于 path,您需要使用显式变量语法(即 %s)。

然后您只需根据环境更改 MyIotHubPath(应用程序设置)和 MyIotHubConnection(连接字符串设置)的配置值。