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

如何在ARM模板中基于条件部署属性不同的同类型Azure资源

解决方法

你遇到的报错是因为ARM模板在校验阶段会先扫描所有资源声明,只要出现两个类型、名称完全相同的资源,哪怕加了部署条件,也会被判定为重复声明,直接阻断部署。
推荐最优方案是合并为单个托管计划资源声明,所有差异化属性通过ARM内置的if()条件函数动态赋值,无需拆分多个资源:

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2018-02-01",
    "name": "[concat(variables('hostingPlanName'), '-', parameters('skuName'))]",
    "location": "[resourceGroup().location]",
    "kind": "linux",
    "properties": "[if(equals(parameters('skuTier'), 'Dynamic'), 
        json('{\"name\": \"[concat(variables(\'hostingPlanName\'), \'-\', parameters(\'skuName\'))]\", \"computeMode\": \"Dynamic\"}'),
        json('{\"name\": \"[concat(variables(\'hostingPlanName\'), \'-\', parameters(\'skuName\'))]\", \"workerSize\": \"[parameters(\'workerSize\')]\", \"workerSizeId\": \"[parameters(\'workerSizeId\')]\", \"numberOfWorkers\": \"[parameters(\'numberOfWorkers\')]\", \"reserved\": true, \"maximumElasticWorkerCount\": \"20\"}')
    )]",
    "sku": {
        "tier": "[parameters('skuTier')]",
        "name": "[variables('skuName')]"
    },
    "tags": {
        "Project": "[parameters('fullProjectName')]"
    }
}

关键说明

  • 上述示例通过if()+json()函数直接返回不同SKU对应的属性配置,你也可以选择把不同SKU的属性预先定义在variables变量中,直接通过参数匹配取值,代码可读性更高:
    "variables": {
        "hostingPlanProps": {
            "Dynamic": {
                "name": "[concat(variables('hostingPlanName'), '-', parameters('skuName'))]",
                "computeMode": "Dynamic"
            },
            "ElasticPremium": {
                "name": "[concat(variables('hostingPlanName'), '-', parameters('skuName'))]",
                "workerSize": "[parameters('workerSize')]",
                "workerSizeId": "[parameters('workerSizeId')]",
                "numberOfWorkers": "[parameters('numberOfWorkers')]",
                "reserved": true,
                "maximumElasticWorkerCount": "20"
            }
        }
    },
    // 资源属性直接引用变量
    "properties": "[variables('hostingPlanProps')[parameters('skuTier')]]"
    
  • 整个资源只有一份声明,完全避开了重复资源的校验问题
    如果你确实需要拆分两个独立资源,只需把两个托管计划的name字段设为不同值,后续Function App关联托管计划ID时,同样用if()函数选择对应环境的托管计划ID即可,该方案适合两种托管计划需要并存的场景。

内容的提问来源于stack exchange,提问作者tommyb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 03:27:03