通过 ARM 模板覆盖现有 azure 函数应用程序的 appSettings
Override appSettings of existing azure function app via ARM templates
我开发了一个azure timer触发函数。我正在从函数应用程序的 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。相反,它 returns 一个错误 "Web site already exists"
是否有任何方法可以如上所述覆盖 appSettings 并重新启动功能应用程序以影响新的 appSettings 参数。
根据我的测试,你的模板在我这边工作正常。
只是一些信息供您参考。
这是我的函数应用程序:
在门户中测试模板:
部署结果:
登录门户:
注意: 会覆盖app的所有设置,部署前,我的app中还有其他设置,目前只有两个设置。
除此之外,我推荐大家使用REST API, essentially, the template is also calling API. You could also use powershell to do it, here is a similar post, you could refer to .
代替ARM模板
对于遇到此问题的任何人,可以使用 手臂模板覆盖 Microsoft.Web/sites
资源的应用程序设置 (对于某些扩建情况可能很重要,以避免除了 arm 模板之外还必须使用脚本):
创建 app settings as an outer child resource:
"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')]"
}
}
]
这样它就不会被检测为对网站的覆盖,因此可以被部署。
我开发了一个azure timer触发函数。我正在从函数应用程序的 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。相反,它 returns 一个错误 "Web site already exists" 是否有任何方法可以如上所述覆盖 appSettings 并重新启动功能应用程序以影响新的 appSettings 参数。
根据我的测试,你的模板在我这边工作正常。
只是一些信息供您参考。
这是我的函数应用程序:
在门户中测试模板:
部署结果:
登录门户:
注意: 会覆盖app的所有设置,部署前,我的app中还有其他设置,目前只有两个设置。
除此之外,我推荐大家使用REST API, essentially, the template is also calling API. You could also use powershell to do it, here is a similar post, you could refer to
对于遇到此问题的任何人,可以使用 手臂模板覆盖 Microsoft.Web/sites
资源的应用程序设置 (对于某些扩建情况可能很重要,以避免除了 arm 模板之外还必须使用脚本):
创建 app settings as an outer child resource:
"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')]"
}
}
]
这样它就不会被检测为对网站的覆盖,因此可以被部署。