ARM模板中使用copy函数批量添加应用连接字符串报错求助
问题分析与解决方案
错误原因
你遇到的报错源于两个核心问题:
- API版本不支持属性级copy:当前使用的
2015-08-01版本Microsoft.Web/sitesAPI,尚未支持在资源属性内部(如connectionStrings数组)使用copy循环,仅支持资源级别的copy操作。 - copy循环位置错误:即便API版本支持,你将copy块放在了数组元素内部,正确的写法应该是把copy块放在目标数组的同级,通过copy迭代生成数组的多个元素。
修正方案(推荐)
升级API版本到支持属性级copy的稳定版本(如2021-03-01),并调整copy循环的位置:
{ "name": "[variables('AppName')]", "type": "Microsoft.Web/sites", "location": "[resourceGroup().location]", "apiVersion": "2021-03-01", // 升级到支持属性级copy的版本 "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', variables('AppPlanName'))]" ], "tags": { "[concat('hidden-related:', resourceId('Microsoft.Web/serverfarms', variables('AppPlanName')))]": "Resource", "displayName": "Web App" }, "properties": { "name": "[variables('AppName')]", "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('AppPlanName'))]", "httpsOnly": true, "siteConfig": { "connectionStrings": [], // 将copy块移到connectionStrings数组同级,定义循环生成规则 "copy": [ { "name": "connectionStrings", "count": "[length(variables('databasesNames'))]", "input": { "name": "[variables('databasesNames')[copyIndex('connectionStrings')]]", "connectionString": "[concat('Server=tcp:', variables('SqlServerName'), '.database.windows.net,1433;Initial Catalog=',variables('databasesNames')[copyIndex('connectionStrings')], ';Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;User ID=', variables('dbAdminLogin'), ';Password=', variables('singleQuote'), parameters('serverAdminLoginPassword'), variables('singleQuote'), ';')]", "type": "SQLAzure" // 显式指定连接字符串类型,规范配置 } } ] } } }
关键修正点说明
- API版本升级:
2018-02-01及以后的Microsoft.Web/sitesAPI支持属性级copy循环,选择较新稳定版本可避免兼容性问题。 - copy循环写法:通过
copy数组定义要生成的目标数组(connectionStrings),用input指定每个数组元素的模板,copyIndex指定循环名称可避免多循环场景下的歧义。 - 变量引用修正:原代码中
"name": "variables('databasesNames')[copyIndex()]"缺少方括号包裹,无法正确解析变量,修正为"[variables('databasesNames')[copyIndex('connectionStrings')]]"。
替代方案(不升级API版本)
如果必须使用旧版API,可通过资源级copy结合数组拼接实现,但这种写法会生成多个Web App实例,仅适合特殊场景:
"variables": { "databasesNames": ["db1", "db2"], "baseConnectionStrings": [] }, "resources": [ { "name": "[variables('AppName')]", "type": "Microsoft.Web/sites", "apiVersion": "2015-08-01", "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', variables('AppPlanName'))]" ], "copy": { "name": "connectionStringLoop", "count": "[length(variables('databasesNames'))]" }, "properties": { "siteConfig": { "connectionStrings": "[concat(variables('baseConnectionStrings'), [ { "name": "[variables('databasesNames')[copyIndex()]]", "connectionString": "[concat('Server=tcp:', variables('SqlServerName'), '.database.windows.net,1433;Initial Catalog=',variables('databasesNames')[copyIndex()], ';Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;User ID=', variables('dbAdminLogin'), ';Password=', variables('singleQuote'), parameters('serverAdminLoginPassword'), variables('singleQuote'), ';')]", "type": "SQLAzure" } ])]" } } } ]
此方案会为每个数据库生成一个Web App实例,不符合批量添加连接字符串到单个Web App的需求,因此优先推荐升级API版本的方案。
内容的提问来源于stack exchange,提问作者François
相关产品推荐
相关产品推荐

