通过ARM模板覆盖现有azure function应用程序的应用程序设置

通过ARM模板覆盖现有azure function应用程序的应用程序设置,azure,azure-web-app-service,azure-functions,azure-resource-manager,azure-deployment,Azure,Azure Web App Service,Azure Functions,Azure Resource Manager,Azure Deployment,我开发了一个azure定时器触发函数。我从功能应用程序的appSettings中获取计时器时间表,如下所示 function.json 对于给定的静态计划,这工作正常。但当用户需要更改计划时,此计划应该能够根据另一个web应用程序的用户需求进行更改 我正在努力从外部应用程序动态更改计划参数。我尝试的是部署一个ARM模板,从下面的ARM模板中注入新的计划值 { "$schema": "http://schema.management.azure.com/schemas/2014-0

我开发了一个azure定时器触发函数。我从功能应用程序的appSettings中获取计时器时间表,如下所示

function.json

对于给定的静态计划,这工作正常。但当用户需要更改计划时,此计划应该能够根据另一个web应用程序的用户需求进行更改

我正在努力从外部应用程序动态更改计划参数。我尝试的是部署一个ARM模板,从下面的ARM模板中注入新的计划值

    {
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "String"
    },
    "location": {
      "type": "String"
    },
    "subscriptionId": {
      "type": "String"
    },
    "schedule1": {
      "type": "String"
    },
    "schedule2": {
      "type": "String"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Web/sites",
      "kind": "functionapp",
      "name": "[parameters('name')]",
      "apiVersion": "2016-03-01",
      "location": "[parameters('location')]",
      "properties": {
        "name": "[parameters('name')]",
        "siteConfig": {
          "appSettings": [
            {
              "name": "schedule1",
              "value": "[parameters('schedule1')]"
            },
            {
              "name": "schedule2",
              "value": "[parameters('schedule2')]"
            }
          ]
        },
        "clientAffinityEnabled": false,
        "reserved": false
      }
    }
  ]
}
但是,这不会覆盖现有的appSettings。相反,它返回一个错误“网站已经存在”
是否有任何方法可以覆盖上述appSettings并重新启动函数应用程序,以影响新的appSettings参数。

根据我的测试,您的模板在我这边可以正常工作

只是一些信息供你参考

这是我的功能应用程序:

在门户中测试模板:

部署结果:

在门户中签入:

注意:它将覆盖应用程序的所有设置,在部署之前,我的应用程序中还有其他设置,目前只有两个设置


除了之外,我建议您不要使用ARM模板,实际上,该模板也在调用API。您也可以使用powershell来实现这一点,这里有一篇类似的帖子,您可以参考。

根据我的测试,您的模板在我这边运行良好

只是一些信息供你参考

这是我的功能应用程序:

在门户中测试模板:

部署结果:

在门户中签入:

注意:它将覆盖应用程序的所有设置,在部署之前,我的应用程序中还有其他设置,目前只有两个设置


除了之外,我建议您不要使用ARM模板,实际上,该模板也在调用API。您也可以使用powershell来执行此操作,这里有一篇类似的帖子,您可以参考。

对于任何遇到此问题的人,都可以使用arm模板覆盖Microsoft.Web/sites资源的应用程序设置(对于某些构建情况可能很重要,以避免在arm模板之外使用脚本):

将创建为:


通过这种方式,它不会被检测为对网站的覆盖,因此允许部署。

对于遇到这种情况的任何人,都可以使用arm模板覆盖Microsoft.Web/sites资源的应用程序设置(对于某些构建情况可能很重要,以避免在arm模板之外使用脚本):

将创建为:


这样,它就不会被检测为对网站的覆盖,从而允许部署。

为什么不使用powershell?使用它更改一个值要容易得多?我想通过另一个托管在azure应用程序服务中的web应用程序更改功能应用程序的时间表。在那种情况下,我不能使用power shell吗?你可以,只是它不太方便。这就是为什么不使用powershell?使用它更改一个值要容易得多?我想通过另一个托管在azure应用程序服务中的web应用程序更改功能应用程序的时间表。在那种情况下,我不能使用power shell吗?你可以,只是它不太方便。这就是你的快乐王。你救了我一天。我可以通过REST做到这一点,我想你是Joy Wang。你救了我一天。我可以通过RESTAPI来实现
"resources": [
    {
        "type": "Microsoft.Web/sites",
        "kind": "functionapp",
        "name": "[parameters('name')]",
        "apiVersion": "2016-03-01",
        "location": "[parameters('location')]",
        "properties": {
            "name": "[parameters('name')]",
            "clientAffinityEnabled": false,
            "reserved": false
        }
    },
    {
        "name": "[concat(parameters('name'), '/', 'appsettings')]",
        "type": "Microsoft.Web/sites/config",
        "apiVersion": "2018-11-01",
        "dependsOn": [
            "[resourceId('Microsoft.Web/sites',parameters('name'))]"
        ],
        "properties": {
            "schedule1": "[parameters('schedule1')]",
            "schedule2": "[parameters('schedule2')]"
        }
    }
]