【问题标题】:How to create multiple Service Bus topics using ARM template?如何使用 ARM 模板创建多个服务总线主题?
【发布时间】:2016-08-25 12:43:58
【问题描述】:

我查看了https://github.com/Azure/azure-quickstart-templates/tree/master/101-servicebus-topic 示例。现在我试图弄清楚如何在使用嵌套资源循环 (https://azure.microsoft.com/en-us/documentation/articles/resource-group-create-multiple/#looping-on-a-nested-resource) 运行部署脚本时创建多个主题。

最好在serviceBusTopicName 的值中定义一个数组,然后以某种方式通过循环创建主题,而不是手动执行。

我在尝试部署时收到以下错误。

 Error: Code=InvalidTemplate; Message=Deployment template validation failed: 'The template resource '[parameters('serviceBusTopicName')[copyIndex()]]' at line '72' column '14' is not valid.
 Copying nested resources is not supported. Please see https://aka.ms/arm-copy/#looping-on-a-nested-resource for usage details.'.

这是我试图开始工作的template.json。

  "parameters": {
"serviceBusNamespaceName": {
  "type": "string",
  "metadata": {
    "description": "Name of the Service Bus namespace"
  }
},
"serviceBusTopicName": {
  "type": "array",
  "metadata": {
    "description": "Name of the Topic"
  }
},
"serviceBusApiVersion": {
  "type": "string",
  "defaultValue": "2015-08-01",
  "metadata": {
    "description": "Service Bus ApiVersion used by the template"
  },
  "resources": [
{
  "apiVersion": "[variables('sbVersion')]",
  "name": "[parameters('serviceBusNamespaceName')]",
  "type": "Microsoft.ServiceBus/Namespaces",
  "location": "[variables('location')]",
  "kind": "Messaging",
  "sku": {
    "name": "StandardSku",
    "tier": "Standard"
  },
  "resources": [
    {
      "apiVersion": "[variables('sbVersion')]",
      "name": "[parameters('serviceBusTopicName')]",
      "type": "Topics",
      "dependsOn": [
        "[concat('Microsoft.ServiceBus/namespaces/', parameters('serviceBusNamespaceName'))]"
      ],
      "properties": {
        "path": "[parameters('serviceBusTopicName')]"
      },
      "copy": {
        "name": "datasetcopy",
        "count": "[length(parameters('serviceBusTopicName'))]"
      }
    }
  ]
},

parameters.json

{"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "serviceBusNamespaceName": {
        "value": "ServiceBus"
    },
  "serviceBusTopicName": {
    "value": [
      "Person",
      "Stadium",
      "Team"
    ]
  },
    "serviceBusApiVersion": {
        "value": "2015-08-01"
    }
}

【问题讨论】:

    标签: json azure azureservicebus azure-resource-manager azure-deployment


    【解决方案1】:

    正如@Lain 所说,目前Check Here 不支持复制嵌套资源。要部署多个资源,您必须将其移至根目录。我刚刚完成了部署多个主题的 POC(假设命名空间已经存在的只是主题)这里是代码。我将主题名称作为逗号分隔的字符串传递:

    {
    "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "serviceBusNamespaceName": {
            "type": "string",
            "metadata": {
                "description": "Name of the Service Bus namespace"
            }
        },
        "serviceBusTopicName": {
            "type": "string",
            "metadata": {
                "description": "Comma seperated Topic Names"
            }
        },
        "serviceBusApiVersion": {
            "type": "string",
            "defaultValue": "2015-08-01",
            "metadata": {
                "description": "Service Bus ApiVersion used by the template"
            }
        }
    },
    "variables": {
        "location": "[resourceGroup().location]",
        "sbVersion": "[parameters('serviceBusApiVersion')]",
        "TopicNames": "[split(parameters('serviceBusTopicName'), ',')]"
    },
    "resources": [{
        "apiVersion": "[variables('sbVersion')]",
        "name": "[concat(parameters('serviceBusNamespaceName'), '/', variables('TopicNames')[copyIndex()])]",
        "type": "Microsoft.ServiceBus/Namespaces/Topics",
        "copy": {
            "name": "TopicNameCopy",
            "count": "[length(variables('TopicNames'))]"
        },
        "properties": {
            "path": "[variables('TopicNames')[copyIndex()]]"
        }
    }]
    }
    

    【讨论】:

      【解决方案2】:

      错误消息中的链接很好地解决了这个问题,但是嵌套资源中不能有循环,您需要将资源推送到顶层,然后使用名称将资源链接在一起。这个模板会做你想做的事:

      {
        "$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"
            }
          },
          "serviceBusTopicNames": {
            "type": "array",
            "metadata": {
              "description": "Name of the Service Bus Topic"
            }
          }
        },
        "variables": {
          "sbVersion": "2015-08-01"
        },
        "resources": [
          {
            "apiVersion": "[variables('sbVersion')]",
            "name": "[parameters('serviceBusNamespaceName')]",
            "type": "Microsoft.ServiceBus/namespaces",
            "location": "[resourceGroup().location]",
            "properties": {
            }
          },
          {
            "apiVersion": "[variables('sbVersion')]",
            "name": "[concat(parameters('serviceBusNamespaceName'), '/',  parameters('serviceBusTopicNames')[copyIndex()])]",
            "type": "Microsoft.ServiceBus/namespaces/Topics",
            "dependsOn": [
              "[concat('Microsoft.ServiceBus/namespaces/', parameters('serviceBusNamespaceName'))]"
            ],
            "copy": {
              "name": "datasetcopy",
              "count": "[length(parameters('serviceBusTopicNames'))]"
            },
            "properties": {
              "path": "[parameters('serviceBusTopicNames')[copyIndex()]]"
            },
            "resources": [
            ]
          }
        ]
      }
      

      【讨论】:

        猜你喜欢
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 2021-03-20
        • 2017-06-05
        • 2017-04-25
        • 1970-01-01
        相关资源
        最近更新 更多