使用 Azure ARM 模板创建带有 Sql 过滤器的服务总线主题订阅?
Use Azure ARM Template to create Service Bus Topic Subscription with Sql Filter?
我已经知道如何设置一个 Azure ARM 模板,creates/manages 一个 Azure 服务总线命名空间、主题和订阅来接收所有消息。但是,Microsoft 文档在 ARM Tempates 上仍然非常缺乏,我无法弄清楚如何在您可以使用 .NET SDK 管理的模板中为订阅定义 SqlFilter。
有谁知道如何在 ARM 模板中向服务总线主题订阅添加 Sql 过滤器?
这是我的 ARM 模板的 link,用于在没有 Sql 过滤器的情况下创建服务总线主题和订阅:
此外,这是我所指的 ARM 模板的来源:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"serviceBusNamespaceName": {
"type": "string",
"metadata": {
"description": "Name of the Service Bus Namespace"
}
},
"serviceBusTopicName": {
"type": "string",
"metadata": {
"description": "Name of the Service Bus Topic"
}
},
"serviceBusTopicSubscriptionName": {
"type": "string",
"metadata": {
"description": "Name of the Service Bus Topic Subscription"
}
}
},
"variables": {
"sbVersion": "2015-08-01"
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusNamespaceName')]",
"type": "Microsoft.ServiceBus/namespaces",
"location": "[resourceGroup().location]",
"properties": {
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicName')]",
"type": "Topics",
"dependsOn": [
"[concat('Microsoft.ServiceBus/namespaces/', parameters('serviceBusNamespaceName'))]"
],
"properties": {
"path": "[parameters('serviceBusTopicName')]"
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicSubscriptionName')]",
"type": "Subscriptions",
"dependsOn": [
"[parameters('serviceBusTopicName')]"
],
"properties": {
},
"resources": [
]
}
]
}
]
}
],
"outputs": {
}
}
A Sql 过滤器应该在规则中,因此我们应该在服务总线主题订阅中创建规则。例如:
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicSubscriptionName')]",
"type": "Subscriptions",
"dependsOn": [
"[parameters('serviceBusTopicName')]"
],
"properties": {
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicSubscriptionRuleName')]",
"type": "Rules",
"dependsOn": [
"[parameters('serviceBusTopicSubscriptionName')]"
],
"properties": {
},
"resources": [
]
}
]
}
]
我尝试部署此模板,但出现以下错误:
New-AzureRmResourceGroupDeployment : InvalidTemplate: Deployment template validation failed: 'The template resource 'Microsoft.ServiceBus/namespaces/<serviceBusNamespaceName>/Topics/<serviceBusTopicName>/Subscriptions/<serviceBusTopicSubscriptionName>' cannot reference itself. Please see http://aka.ms/arm-template-expressions/#reference for usage details.'.
At line:1 char:1
+ New-AzureRmResourceGroupDeployment -Name ServiceBusTest -ResourceGrou ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [New-AzureRmResourceGroupDeployment], CloudException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.Resources.NewAzureResourceGroupDeploymentCommand
根据错误消息“'模板资源无法引用自身”,我猜测在 ARM 模板中尚未实现为主题订阅创建 Sql 过滤器。
经过更多的挖掘,我相信主题订阅规则还不能被资源管理器管理。这是我尝试过的东西。
我使用 this PowerShell script 创建一个带有规则的主题订阅。我通过向规则添加名称 $RuleDescription.Name = "rule1"
.
对脚本进行了一些修改
主题订阅已成功创建,我可以使用以下PowerShell命令获取主题订阅。
Get-AzureRmResource -ResourceGroupName Default-ServiceBus-EastUS `
-ResourceType Microsoft.ServiceBus/namespaces/topics/Subscriptions `
-ResourceName <namespace>/<topic>/<subscription> `
-ApiVersion 2014-09-01
当我尝试使用类似的 PowerShell 命令获取主题订阅规则时:
Get-AzureRmResource -ResourceGroupName Default-ServiceBus-EastUS `
-ResourceType Microsoft.ServiceBus/namespaces/topics/Subscriptions/Rules `
-ResourceName <namespace>/<topic>/<subscription>/rule1 `
-ApiVersion 2014-09-01
我收到以下错误:
No HTTP resource was found that matches the request URI
'https://sbgm.windows.net/subscriptions/<subscriptionid>/resourceGroups/Default-ServiceBus-EastUS/providers/Microsoft.ServiceBus/namespaces/<namespace>/topics/<topic>/Subscriptions/<subscription>/Rules/rule1?api-version=2014-09-01'
但是,如果我使用$NamespaceManager.GetRules($TopicPath,$Name)
,我确实成功地获得了上述规则。即规则创建成功
目前,ARM 模板不支持 creating/managing Azure 服务总线主题订阅筛选器。
现在可以按照以下快速启动模板实现,该模板说明了如何添加 SQL 过滤器:
此外,如果您希望通过 ARM 添加相关过滤器,我已经能够通过如下设置 Rules
资源来实现:
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "$Default",
"type": "Rules",
"dependsOn": [
"[parameters('serviceBusSubscriptionName')]"
],
"properties": {
"filter": {
"correlationId": "[parameters('correlationId')]"
}
}
}
]
只需将以下内容添加到您的订阅资源中即可创建 SQL 过滤器和操作:
,"resources": [{
"apiVersion": "[variables('sbVersion')]",
"name": "$Default",
"type": "Rules",
"dependsOn": ["[parameters('serviceBusSubscriptionName')]"],
"properties": {
"filterType": "SqlFilter",
"sqlFilter": {
"sqlExpression": "1=1",
"requiresPreprocessing": false
},
"action": {
"sqlExpression": "set something = 'something'"
}
}
}]
最近更改了添加 Sql 过滤器的订阅语法。
<snip>
"apiVersion": "2017-04-01",
"name": "[parameters('serviceBusSubscriptionName')]",
<snip>
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('serviceBusRuleName')]",
"type": "Rules",
"dependsOn": [
"[parameters('serviceBusSubscriptionName')]"
],
"properties": {
"filterType": "SqlFilter",
"sqlFilter": {
"sqlExpression": "FilterTag = 'true'",
"requiresPreprocessing": "false"
},
"action": {
"sqlExpression": "set FilterTag = 'true'"
}
}
}
]
您可以在此 ARM 模板中找到最新示例:
https://github.com/Azure/azure-quickstart-templates/blob/master/201-servicebus-create-topic-subscription-rule/azuredeploy.json
使用服务总线资源管理器应用程序。
如果您已经知道要创建什么 SQL 过滤器,我建议您下载并使用此应用程序。从 here
下载
- 您只需要连接到您的服务总线,将规则添加到订阅。
- 然后,转到 Azure 门户并检索该特定服务总线的 ARM 模板。
- 您将能够看到 SQL 过滤器是如何构建的。
这是向订阅添加规则的方式:
这是您查看自己创建的规则的方式:
Service Bus Explorer 应用程序的使用非常简单。
由于它是用户交互的,您始终可以配置服务总线,然后转到 Azure 门户检索 ARM 模板。
我已经知道如何设置一个 Azure ARM 模板,creates/manages 一个 Azure 服务总线命名空间、主题和订阅来接收所有消息。但是,Microsoft 文档在 ARM Tempates 上仍然非常缺乏,我无法弄清楚如何在您可以使用 .NET SDK 管理的模板中为订阅定义 SqlFilter。
有谁知道如何在 ARM 模板中向服务总线主题订阅添加 Sql 过滤器?
这是我的 ARM 模板的 link,用于在没有 Sql 过滤器的情况下创建服务总线主题和订阅:
此外,这是我所指的 ARM 模板的来源:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"serviceBusNamespaceName": {
"type": "string",
"metadata": {
"description": "Name of the Service Bus Namespace"
}
},
"serviceBusTopicName": {
"type": "string",
"metadata": {
"description": "Name of the Service Bus Topic"
}
},
"serviceBusTopicSubscriptionName": {
"type": "string",
"metadata": {
"description": "Name of the Service Bus Topic Subscription"
}
}
},
"variables": {
"sbVersion": "2015-08-01"
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusNamespaceName')]",
"type": "Microsoft.ServiceBus/namespaces",
"location": "[resourceGroup().location]",
"properties": {
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicName')]",
"type": "Topics",
"dependsOn": [
"[concat('Microsoft.ServiceBus/namespaces/', parameters('serviceBusNamespaceName'))]"
],
"properties": {
"path": "[parameters('serviceBusTopicName')]"
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicSubscriptionName')]",
"type": "Subscriptions",
"dependsOn": [
"[parameters('serviceBusTopicName')]"
],
"properties": {
},
"resources": [
]
}
]
}
]
}
],
"outputs": {
}
}
A Sql 过滤器应该在规则中,因此我们应该在服务总线主题订阅中创建规则。例如:
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicSubscriptionName')]",
"type": "Subscriptions",
"dependsOn": [
"[parameters('serviceBusTopicName')]"
],
"properties": {
},
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "[parameters('serviceBusTopicSubscriptionRuleName')]",
"type": "Rules",
"dependsOn": [
"[parameters('serviceBusTopicSubscriptionName')]"
],
"properties": {
},
"resources": [
]
}
]
}
]
我尝试部署此模板,但出现以下错误:
New-AzureRmResourceGroupDeployment : InvalidTemplate: Deployment template validation failed: 'The template resource 'Microsoft.ServiceBus/namespaces/<serviceBusNamespaceName>/Topics/<serviceBusTopicName>/Subscriptions/<serviceBusTopicSubscriptionName>' cannot reference itself. Please see http://aka.ms/arm-template-expressions/#reference for usage details.'.
At line:1 char:1
+ New-AzureRmResourceGroupDeployment -Name ServiceBusTest -ResourceGrou ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [New-AzureRmResourceGroupDeployment], CloudException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.Resources.NewAzureResourceGroupDeploymentCommand
根据错误消息“'模板资源无法引用自身”,我猜测在 ARM 模板中尚未实现为主题订阅创建 Sql 过滤器。
经过更多的挖掘,我相信主题订阅规则还不能被资源管理器管理。这是我尝试过的东西。
我使用 this PowerShell script 创建一个带有规则的主题订阅。我通过向规则添加名称
$RuleDescription.Name = "rule1"
. 对脚本进行了一些修改
主题订阅已成功创建,我可以使用以下PowerShell命令获取主题订阅。
Get-AzureRmResource -ResourceGroupName Default-ServiceBus-EastUS ` -ResourceType Microsoft.ServiceBus/namespaces/topics/Subscriptions ` -ResourceName <namespace>/<topic>/<subscription> ` -ApiVersion 2014-09-01
当我尝试使用类似的 PowerShell 命令获取主题订阅规则时:
Get-AzureRmResource -ResourceGroupName Default-ServiceBus-EastUS ` -ResourceType Microsoft.ServiceBus/namespaces/topics/Subscriptions/Rules ` -ResourceName <namespace>/<topic>/<subscription>/rule1 ` -ApiVersion 2014-09-01
我收到以下错误:
No HTTP resource was found that matches the request URI 'https://sbgm.windows.net/subscriptions/<subscriptionid>/resourceGroups/Default-ServiceBus-EastUS/providers/Microsoft.ServiceBus/namespaces/<namespace>/topics/<topic>/Subscriptions/<subscription>/Rules/rule1?api-version=2014-09-01'
但是,如果我使用
$NamespaceManager.GetRules($TopicPath,$Name)
,我确实成功地获得了上述规则。即规则创建成功
目前,ARM 模板不支持 creating/managing Azure 服务总线主题订阅筛选器。
现在可以按照以下快速启动模板实现,该模板说明了如何添加 SQL 过滤器:
此外,如果您希望通过 ARM 添加相关过滤器,我已经能够通过如下设置 Rules
资源来实现:
"resources": [
{
"apiVersion": "[variables('sbVersion')]",
"name": "$Default",
"type": "Rules",
"dependsOn": [
"[parameters('serviceBusSubscriptionName')]"
],
"properties": {
"filter": {
"correlationId": "[parameters('correlationId')]"
}
}
}
]
只需将以下内容添加到您的订阅资源中即可创建 SQL 过滤器和操作:
,"resources": [{
"apiVersion": "[variables('sbVersion')]",
"name": "$Default",
"type": "Rules",
"dependsOn": ["[parameters('serviceBusSubscriptionName')]"],
"properties": {
"filterType": "SqlFilter",
"sqlFilter": {
"sqlExpression": "1=1",
"requiresPreprocessing": false
},
"action": {
"sqlExpression": "set something = 'something'"
}
}
}]
最近更改了添加 Sql 过滤器的订阅语法。
<snip>
"apiVersion": "2017-04-01",
"name": "[parameters('serviceBusSubscriptionName')]",
<snip>
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('serviceBusRuleName')]",
"type": "Rules",
"dependsOn": [
"[parameters('serviceBusSubscriptionName')]"
],
"properties": {
"filterType": "SqlFilter",
"sqlFilter": {
"sqlExpression": "FilterTag = 'true'",
"requiresPreprocessing": "false"
},
"action": {
"sqlExpression": "set FilterTag = 'true'"
}
}
}
]
您可以在此 ARM 模板中找到最新示例:
https://github.com/Azure/azure-quickstart-templates/blob/master/201-servicebus-create-topic-subscription-rule/azuredeploy.json
使用服务总线资源管理器应用程序。 如果您已经知道要创建什么 SQL 过滤器,我建议您下载并使用此应用程序。从 here
下载- 您只需要连接到您的服务总线,将规则添加到订阅。
- 然后,转到 Azure 门户并检索该特定服务总线的 ARM 模板。
- 您将能够看到 SQL 过滤器是如何构建的。
这是向订阅添加规则的方式:
这是您查看自己创建的规则的方式:
Service Bus Explorer 应用程序的使用非常简单。 由于它是用户交互的,您始终可以配置服务总线,然后转到 Azure 门户检索 ARM 模板。