如何在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
相关产品推荐
相关产品推荐

