如何在非完整部署模式下用ARM模板删除并重命名Azure Service Bus订阅过滤器?
如何通过ARM模板删除和重命名Azure Service Bus过滤器(非全局完整部署)
问题原因
- 增量部署特性:ARM模板默认采用
Incremental(增量)部署模式,该模式下模板未定义的现有资源不会被自动删除,因此移除Demo111PRADEEP的代码后,Azure门户上的该过滤器仍会保留。 - 资源名称不可修改:Azure ARM资源的名称为创建后不可变更属性,直接修改模板中的过滤器名称只会创建新的过滤器,无法对原有过滤器的名称进行修改。
解决方案
一、删除指定过滤器
若不想对整个资源组使用Complete模式,可采用订阅级规则资源的精准Complete部署:
- 创建ARM模板,仅包含目标订阅下所有需要保留的过滤器,同时必须包含命名空间、主题、订阅的基础定义(避免部署时因依赖缺失报错);
- 部署时将作用域限定为该Service Bus订阅资源,设置部署模式为
Complete,这样只会删除该订阅下未在模板中定义的过滤器,不会影响其他Service Bus资源。
或者更直接的方式:
- 整理所有需要保留的Service Bus资源(命名空间、主题、订阅、要留的过滤器)到模板中,以
Complete模式部署到资源组,模板中未定义的过滤器会被自动删除(需严格核对模板内容,避免误删其他资源)。
二、重命名过滤器
由于ARM资源名称不可修改,只能通过「新建+删除旧资源」的方式实现:
- 在ARM模板中添加新名称的过滤器(如
Demo123Pradeep),复制原过滤器的所有配置(如CorrelationFilter的label参数); - 以增量模式部署模板,创建新的过滤器;
- 验证新过滤器正常接收消息后,按照上述删除方法移除旧名称的过滤器(如
Demo123PRADEEP)。
示例代码(删除过滤器时的模板结构)
假设要保留Demo123Pradeep和Demo456Pradeep,模板结构如下:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "servicebus_name": { "type": "string" }, "location": { "type": "string" }, "topic_name": { "type": "string" }, "subscription_name": { "type": "string" } }, "resources": [ // 保留命名空间(避免Complete模式误删) { "type": "Microsoft.ServiceBus/namespaces", "apiVersion": "2021-06-01-preview", "name": "[parameters('servicebus_name')]", "location": "[parameters('location')]", "sku": { "name": "Standard" // 匹配你的实际SKU } }, // 保留主题 { "type": "Microsoft.ServiceBus/namespaces/topics", "apiVersion": "2021-06-01-preview", "name": "[concat(parameters('servicebus_name'), '/', parameters('topic_name'))]", "location": "[parameters('location')]", "dependsOn": [ "[resourceId('Microsoft.ServiceBus/namespaces', parameters('servicebus_name'))]" ] }, // 保留订阅 { "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions", "apiVersion": "2021-06-01-preview", "name": "[concat(parameters('servicebus_name'), '/', parameters('topic_name'), '/', parameters('subscription_name'))]", "location": "[parameters('location')]", "dependsOn": [ "[resourceId('Microsoft.ServiceBus/namespaces/topics', parameters('servicebus_name'), parameters('topic_name'))]" ] }, // 保留过滤器Demo123Pradeep { "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions/rules", "apiVersion": "2021-06-01-preview", "name": "[concat(parameters('servicebus_name'), '/', parameters('topic_name'), '/', parameters('subscription_name'), '/Demo123Pradeep')]", "location": "[parameters('location')]", "dependsOn": [ "[resourceId('Microsoft.ServiceBus/namespaces/topics/subscriptions', parameters('servicebus_name'), parameters('topic_name'), parameters('subscription_name'))]" ], "properties": { "action": {}, "filterType": "CorrelationFilter", "correlationFilter": { "label": "你的标签值" } } }, // 保留过滤器Demo456Pradeep { "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions/rules", "apiVersion": "2021-06-01-preview", "name": "[concat(parameters('servicebus_name'), '/', parameters('topic_name'), '/', parameters('subscription_name'), '/Demo456Pradeep')]", "location": "[parameters('location')]", "dependsOn": [ "[resourceId('Microsoft.ServiceBus/namespaces/topics/subscriptions', parameters('servicebus_name'), parameters('topic_name'), parameters('subscription_name'))]" ], "properties": { "action": {}, "filterType": "CorrelationFilter", "correlationFilter": { "label": "你的标签值" } } } ] }
部署此模板时使用Complete模式,即可删除未包含在模板中的Demo111PRADEEP过滤器。
内容的提问来源于stack exchange,提问作者Pradeep
相关产品推荐
相关产品推荐

