具有带有多个订阅的主题的Service Bus的Azure ARM模板

Oma*_*lfi 9 servicebus azure azureservicebus azure-resource-manager azure-servicebus-topics

嗨,我有一个用于创建带有主题和订阅的ServiceBus的ARM模板。但是我只能完成1个主题-1个订阅,因为我无法进行嵌套循环来为每个主题创建多个订阅。

我希望我可以执行这样的模板:

参数:

{
   "serviceBusName": "mybus",
   "topics": 
    [ 
      { 
         "topicName": "mytopic1",
         "subscriptions": [ "mysubscription1", "mysubscription2"]
      },
      { 
         "topicName": "mytopic2",
         "subscriptions": [ "mysubscription1"]
      }  
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是我的实际模板:

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "ServiceBusNamespaceName": {
      "type": "string"
    },
    "ServiceBusSku": {
      "type": "string",
      "allowedValues": [
        "Basic",
        "Standard"
      ],
      "defaultValue": "Standard"
    },
    "ServiceBusSmallSizeTopicInMb": {
      "type": "int",
      "defaultValue": 1024
    },
    "ServiceBusMaxSizeTopicInMb": {
      "type": "int",
      "defaultValue": 1024
    },
    "Topics": {
      "type": "array"
    }
  },
  "variables": {
    "DefaultSASKeyName": "RootManageSharedAccessKey",
    "DefaultAuthRuleResourceId": "[resourceId('Microsoft.ServiceBus/namespaces/authorizationRules', parameters('ServiceBusNamespaceName'), variables('DefaultSASKeyName'))]",
    "SbVersion": "2017-04-01"
  },
  "resources": [
    {
      "apiVersion": "2017-04-01",
      "name": "[parameters('ServiceBusNamespaceName')]",
      "type": "Microsoft.ServiceBus/namespaces",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "[parameters('ServiceBusSku')]"
      },
      "tags": {
        "displayName": "ServiceBus"
      }
    },
    {
      "copy": {
        "name": "topics",
        "count": "[length(parameters('Topics'))]"
      },
      "type": "Microsoft.ServiceBus/namespaces/topics",
      "name": "[concat(parameters('ServiceBusNamespaceName'), '/', parameters('Topics')[copyIndex()].topic)]",
      "apiVersion": "2017-04-01",
      "location": "[resourceGroup().location]",
      "scale": null,
      "properties": {
        "defaultMessageTimeToLive": "P1D",
        "maxSizeInMegabytes": "[parameters('ServiceBusMaxSizeTopicInMb')]",
        "requiresDuplicateDetection": false,
        "duplicateDetectionHistoryTimeWindow": "PT10M",
        "enableBatchedOperations": true,
        "status": "Active",
        "supportOrdering": true,
        "autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
        "enablePartitioning": false,
        "enableExpress": false
      },
      "dependsOn": [
        "[resourceId('Microsoft.ServiceBus/namespaces', parameters('ServiceBusNamespaceName'))]"
      ],
      "resources": [
        {
          "apiVersion": "[variables('sbVersion')]",
          "name": "[parameters('Topics')[copyIndex()].subscription]",
          "type": "Subscriptions",
          "dependsOn": [
            "[parameters('Topics')[copyIndex()].topic]"
          ],
          "properties": {
            "lockDuration": "PT1M",
            "requiresSession": "false",
            "defaultMessageTimeToLive": "P7D",
            "deadLetteringOnMessageExpiration": "false",
            "maxDeliveryCount": "2",
            "enableBatchedOperations": "true",
            "autoDeleteOnIdle": "P7D"
          }
        }
      ]
    }
  ],
  "outputs": {
    "NamespaceDefaultConnectionString": {
      "type": "string",
      "value": "[listkeys(variables('DefaultAuthRuleResourceId'), variables('SbVersion')).primaryConnectionString]"
    },
    "DefaultSharedAccessPolicyPrimaryKey": {
      "type": "string",
      "value": "[listkeys(variables('DefaultAuthRuleResourceId'), variables('SbVersion')).primaryKey]"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以及实际模板的params json的示例:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "ServiceBusNamespaceName": {
            "value": "mybus"
        },
        "ServiceBusSku": {
            "value": "Standard"
        },
        "Topics ": {
            "value": [
                {
                    "topic": "mytopic1",
                    "subscription": "mysubscription1"
                },
                {
                    "topic": "mytopic2",
                    "subscription": "mysubscription1"
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*AIT 4

一般来说,有两种方法可以完成这样的事情。您可以重组代码,使订阅成为顶级资源。或者您使用 的命名变体copyIndex来实现嵌套循环。这两种变体都可以在这篇博文及其评论中看到。

\n\n

Azure ARM 模板 \xe2\x80\x93 是否可以嵌套循环?

\n\n

但是,对于您的情况,唯一的选择是将订阅设为顶级资源。有关更多详细信息,请参阅aka.ms/arm-copy/#looping-on-a-nested-resource 。

\n\n

这是取自上述博客文章的完整示例。

\n\n
{\n    "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",\n    "contentVersion": "1.0.0.0",\n    "parameters": {\n        "serviceBusNamespaceName": {\n            "type": "string",\n            "metadata": {\n                "description": "Name of the Service Bus namespace"\n            }\n        },\n        "topics":{\n            "type": "array",\n            "metadata": {\n                "description": "List of topics"\n            }\n        },\n        "subscriptions":{\n            "type": "array",\n            "metadata": {\n                "description": "List of subscriptions"\n            }\n        }\n\n    },\n    "variables": {},\n    "resources": [\n        {\n            "type": "Microsoft.ServiceBus/namespaces",\n            "sku": {\n                "name": "Standard"\n            },\n            "name": "[parameters(\'serviceBusNamespaceName\')]",\n            "apiVersion": "2017-04-01",\n            "location": "[resourceGroup().location]",\n            "properties": {}\n        },\n        {\n            "type": "Microsoft.ServiceBus/namespaces/topics",\n            "name": "[concat(parameters(\'serviceBusNamespaceName\'), \'/\', parameters(\'topics\')[copyIndex()])]",\n            "apiVersion": "2017-04-01",\n            "location": "[resourceGroup().location]",\n            "copy": {\n                "name": "topicLoop",\n                "count": "[length(parameters(\'topics\'))]"\n            },\n            "properties": {},\n            "dependsOn": [\n                "[concat(\'Microsoft.ServiceBus/namespaces/\', parameters(\'serviceBusNamespaceName\'))]"\n            ]\n        },\n        {\n            "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions",\n            "name": "[concat(parameters(\'serviceBusNamespaceName\'), \'/\', parameters(\'subscriptions\')[copyIndex()].topic, \'/\', parameters(\'subscriptions\')[copyIndex()].subscription)]",\n            "apiVersion": "2017-04-01",\n            "location": "[resourceGroup().location]",\n            "copy": {\n                "name": "subscriptionLoop",\n                "count": "[length(parameters(\'subscriptions\'))]"\n            },\n            "properties": {},\n            "dependsOn": [\n                "topicLoop"\n            ]\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
{\n    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",\n    "contentVersion": "1.0.0.0",\n    "parameters": {\n      "serviceBusNamespaceName": {\n        "value": "rjtestsbnmspace"\n      },\n      "topics": {\n        "value": ["topic1", "topic2"]\n      },\n      "subscriptions": {\n        "value": [{\n          "topic": "topic1",\n          "subscription": "subscription1"\n          },\n          {\n            "topic": "topic1",\n            "subscription": "subscription2"\n          },\n          {\n            "topic": "topic2",\n            "subscription": "subscription3"\n          }\n        ]\n      }\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

此虚拟机示例使用命名copyIndex- 当嵌套循环不适用于资源本身时,它会起作用。

\n\n
{\n  "name": "[concat(parameters(\'vmName\'), padLeft(copyIndex(1), 2, \'0\'))]",\n  "type": "Microsoft.Compute/virtualMachines",\n  "copy": {\n    "name": "vmLoop",\n    "count": "[parameters(\'vmCount\')]"\n  },\n  "properties": {\n    "osProfile": {\n      "computerName": "[concat(parameters(\'vmName\'), padLeft(copyIndex(1), 2, \'0\'))]"\n    },\n    "hardwareProfile": {\n      "vmSize": "[parameters(\'vmSize\')]"\n    },\n    "storageProfile": {\n      "osDisk": {\n        "name": "[concat(parameters(\'vmName\'), padLeft(copyIndex(1), 2, \'0\'),\'_OSDisk\')]",\n        "createOption": "FromImage",\n        "managedDisk": {\n          "storageAccountType": "[parameters(\'vmDiskType\')]"\n        }\n      },\n      "copy": [\n        {\n          "name": "dataDisks",\n          "count": "[parameters(\'dataDiskCount\')]",\n          "input": {\n            "caching": "[parameters(\'dataDiskCaching\')]",\n            "name": "[concat(parameters(\'vmName\'), padLeft(copyIndex(\'vmLoop\', 1), 2, \'0\'), \'-dataDisk\', padLeft(copyIndex(\'dataDisks\'), 2, \'0\'))]",\n            "lun": "[copyIndex(\'dataDisks\')]",\n            "createOption": "Empty",\n            "diskSizeGB": "[parameters(\'dataDiskSize\')]",\n            "managedDisk": {\n              "storageAccountType": "[parameters(\'vmDiskType\')]"\n            }\n          }\n        }\n      ]\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n