使用ARM创建Azure Function主机密钥不适用于新的部署

时间:2020-01-29 12:32:43

标签: azure azure-functions azure-resource-manager

我尝试在 ARM 模板中创建Azure函数主机密钥,在该模板中,我首先创建函数,然后创建密钥:

{
  "type": "Microsoft.Web/sites/host/functionKeys",
  "apiVersion": "2018-11-01",
  "name": "[concat(parameters('FUNCTIONNAME'), '/default/test-key')]",
  "properties": {
    "name": "test-key",
    "value": "test-value"
  },
  "dependsOn": [
    "[resourceId('Microsoft.Web/sites', parameters('FUNCTIONNAME'))]"
  ]
}

看起来,当该功能已经部署时,部署将添加主机密钥test-key。如果我将模板部署到新的资源组,则主机密钥不是 创建的。如果我第二次运行部署,那就可以了。

我的dependsOn声明有什么问题吗?还有其他想法吗?

1 个答案:

答案 0 :(得分:4)

在ARM模板中部署功能键存在几个问题。您的代码是正确的,并且如您所说,它有时可以成功部署。 在不了解幕后实际情况的情况下,这里有一些我的(痛苦的)学习内容:

  • 在以某种方式实现功能的内容之前,不会创建键(也许必须查看HttpTrigger是否具有功能)。因此行为取决于代码提供的方式-使用链接的sourcecontrol(例如Github)时,与WEBSITE_RUN_FROM_PACKAGE相比,我遇到了最大的问题。同样在ARM模板中设置sourcecontrol时,您可以为functionKeys资源(例如"[resourceId('Microsoft.Web/sites/sourcecontrols', 'name of function', 'web')]")添加一个dependsOn。这样,我实现了将功能键也部署在完整的初始部署中

  • 当您尝试读取同一ARM模板中的已部署功能键时(例如,用于API管理中),您可能会遇到竞争条件。您可以并且应该使用"[resourceId('Microsoft.Web/sites/host/functionKeys', 'name of function', 'default', 'name of key')]"设置一个dependOn,这在某些情况下可能会有所帮助。但是我也遇到这样的情况,密钥尚未准备好被读取,因此我最终为此进行了后续部署。您可以尝试通过一些“ dependsOn”设置将其链接起来,以便尽可能晚地执行它(嗯,这相当hack)。

  • 如果不为功能键指定值(如代码片段中的test-value),则在每个部署中都会生成一个新值。因此,它不是真正的“增量”,因为它应该是恕我直言。结合上述延迟的密钥可用性,我遇到的问题是,在以后的部署中我总是得到旧版本的密钥值,这很难找出。

  • 如果您认为为什么不使用预定义的主密钥或默认密钥来 避免这些麻烦:我经常遇到奇怪的情况 部署期间更改了主密钥和默认密钥。再说一遍 ARM模板中的引用组件与 密钥的过时值。

希望这些经验会有所帮助。