如何通过Bicep向现有Azure Front Door添加FEE、BEP和RR?
解决方案:向现有Azure Front Door添加FEE/BEP/RR并实现幂等部署
可以直接向现有Front Door(FD)添加前端端点(FEE)、后端池(BEP)和路由规则(RR),且实现“不存在则创建、重复部署忽略”的幂等效果,无需从零重建FD。核心思路是使用嵌套资源类型单独定义每个组件,而非在FD顶级配置中覆盖完整的资源数组。
关键原理
Azure资源管理器默认采用增量部署模式,只要不直接覆盖FD的完整frontendEndpoints/backendPools/routingRules数组,而是通过嵌套资源逐个添加,就只会创建不存在的资源,不会影响现有配置。
修正后的Bicep代码示例
1. 引用现有Front Door
无需使用existing关键字,只需定义FD的基础信息(不覆盖核心配置数组):
resource frontDoor 'Microsoft.Network/frontDoors@2020-05-01' = { name: frontdoorName location: 'global' properties: { enabledState: 'Enabled' // 仅保留不会变更的顶级属性,避免覆盖现有配置 } }
2. 单独添加前端端点(FEE)
以环境唯一命名(如加-dev后缀),确保多环境不冲突:
resource appFe 'Microsoft.Network/frontDoors/frontendEndpoints@2020-05-01' = { parent: frontDoor name: 'app-fe-dev' properties: { hostName: 'app-dev.contoso.com' sessionAffinityEnabledState: 'Disabled' sessionAffinityTtlSeconds: 0 // 如有WAF策略可添加对应id webApplicationFirewallPolicyLink: { id: '' } } }
3. 单独添加后端池(BEP)
关联FD的默认或自定义负载均衡/健康探测配置:
resource appBep 'Microsoft.Network/frontDoors/backendPools@2020-05-01' = { parent: frontDoor name: 'app-bep-dev' properties: { backends: [ { address: 'app-dev.azurewebsites.net' httpPort: 80 httpsPort: 443 weight: 50 priority: 1 enabledState: 'Enabled' } ] loadBalancingSettings: { id: '${frontDoor.id}/loadBalancingSettings/default' } healthProbeSettings: { id: '${frontDoor.id}/healthProbeSettings/default' } } }
4. 单独添加路由规则(RR)
关联对应的FEE和BEP,支持转发或重定向规则:
// 转发规则 resource appRr 'Microsoft.Network/frontDoors/routingRules@2020-05-01' = { parent: frontDoor name: 'app-rr-dev' properties: { frontendEndpoints: [ { id: appFe.id } ] acceptedProtocols: ['Http', 'Https'] patternsToMatch: ['/*'] routeConfiguration: { '@odata.type': '#Microsoft.Azure.FrontDoor.Models.FrontDoorForwardingConfiguration' backendPool: { id: appBep.id } forwardingProtocol: 'HttpsOnly' } enabledState: 'Enabled' } } // HTTP重定向规则 resource httpRedirectRr 'Microsoft.Network/frontDoors/routingRules@2020-05-01' = { parent: frontDoor name: 'http-redirect-rr-dev' properties: { frontendEndpoints: [ { id: appFe.id } ] acceptedProtocols: ['Http'] patternsToMatch: ['/*'] routeConfiguration: { '@odata.type': '#Microsoft.Azure.FrontDoor.Models.FrontDoorRedirectConfiguration' redirectType: 'Moved' redirectProtocol: 'HttpsOnly' } enabledState: 'Enabled' } }
注意事项
- 资源命名唯一性:每个环境的FEE/BEP/RR需用环境标识(如
dev/test/preprod)作为名称后缀,避免多环境配置冲突。 - 避免覆盖现有配置:绝对不要在顶级FD资源中定义完整的
frontendEndpoints/backendPools/routingRules数组,否则会替换掉FD中所有现有对应资源。 - 幂等性保障:重复部署时,Azure会检查资源名称是否存在,存在则跳过创建,仅更新有变更的属性(若需修改属性,可直接调整对应嵌套资源的配置)。
内容的提问来源于stack exchange,提问作者Echilon
相关产品推荐
相关产品推荐

