You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM模板中使用copy函数批量添加应用连接字符串报错求助

问题分析与解决方案

错误原因

你遇到的报错源于两个核心问题:

  1. API版本不支持属性级copy:当前使用的2015-08-01版本Microsoft.Web/sites API,尚未支持在资源属性内部(如connectionStrings数组)使用copy循环,仅支持资源级别的copy操作。
  2. 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/sites API支持属性级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:27:23