如何使用Bicep为现有Azure安全策略添加新域且保留原有关联?
解决Front Door安全策略添加新域时覆盖原有关联的问题
问题原因
增量模式下,ARM部署会严格按照模板定义的属性更新资源。如果Bicep代码硬编码了associations数组(仅包含当前新域),部署时会直接替换安全策略中原有关联数组,导致旧域的安全策略被移除。
解决方案
通过Bicep的tryGetResource函数读取现有安全策略的关联信息,合并新旧域后再部署,确保所有已关联的域都被保留。具体逻辑如下:
- 尝试获取已存在的安全策略资源;
- 提取现有关联的所有域ID;
- 将新域ID与现有域ID合并去重;
- 构建包含所有域的关联数组,部署更新安全策略。
完整Bicep代码示例
// 尝试读取现有安全策略,不存在则返回null var existingSecurityPolicy = tryGetResource('Microsoft.Cdn/profiles/securitypolicies@2022-11-01-preview', fdprofile.name, securityPolicyName) // 提取现有安全策略中所有关联的域ID var existingDomainIds = existingSecurityPolicy != null ? flatten(existingSecurityPolicy.properties.parameters.associations[*].domains[*].id) : [] // 合并现有域ID与新域ID,自动去重 var allDomainIds = union(existingDomainIds, [fdEndpoint.id]) // 构建包含所有域的关联配置 var updatedAssociations = [ { domains: allDomainIds.map(domainId => ({ id: domainId })) patternsToMatch: ['/*'] } ] resource security_policies 'Microsoft.Cdn/profiles/securitypolicies@2022-11-01-preview' = { parent: fdprofile name: securityPolicyName properties: { parameters: { wafPolicy: { id: waf.id } associations: updatedAssociations type: 'WebApplicationFirewall' } } }
说明
tryGetResource函数会尝试获取指定安全策略资源,首次部署时返回null,此时直接用新域创建安全策略;flatten和union函数用于处理域ID的提取与合并,避免重复关联同一域;- 该方案无需感知其他应用服务的存在,仅通过读取现有安全策略配置实现增量更新,符合你的部署场景要求。
内容的提问来源于stack exchange,提问作者Don Chambers
相关产品推荐
相关产品推荐

