在具有多个身份验证规则的多个区域中创建事件中心时,ARM 模板失败

ARM template fails when creating event hub in multiple regions with multiple auth rules

我有一个 ARM 模板,它在两个区域(eastus 和 westus2)中使用事件中心和多个身份验证规则(在 even hub 上)创建事件中心命名空间。这一直有效到 2020 年 11 月 16 日 12:00PM。 手臂模板:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {    
    "location-region1": {
      "type": "string",
      "defaultValue": "eastus",
      "metadata": {
        "description": "Name of an azure region"
      }
    },
    "location-region2": {
      "type": "string",
      "defaultValue": "westus2",
      "metadata": {
        "description": "Name of an Azure region"
      }
    },   
    "appName": {
      "type": "string",
      "defaultValue": "jklm",
      "metadata": {
        "description": "Short name of the app or service"
      }
    },
    "uniqueSuffix": {
      "type": "string",
      "defaultValue": "tst",
      "metadata": {
        "description": "Unique Suffix to use for the azure resources of the app or service"
      }
    },
    "environment": {
      "type": "string",
      "defaultValue": "int",
      "allowedValues": [
        "poc",
        "dev",
        "int",
        "uat",
        "prod"
      ],
      "metadata": {
        "description": "The name of the environment"
      }
    },   
    "progressRecordsEventHubName": {
      "type": "string",
      "defaultValue": "progressrecords"
    }
  },
  "variables": {    
    "eventHubNMApiVersion": "2018-01-01-preview",
    "eventHubApiVersion": "2017-04-01",    
    "parentResourceGroupName": "[resourceGroup().name]",
    "regionCount": 2,  
    "location": [
      "[parameters('location-region1')]",
      "[parameters('location-region2')]"
    ],
   
    "appName": "[concat(parameters('appName'),'-',parameters('uniqueSuffix'),'-')]",
   
    "copy": [
      {
        "name": "regionSuffix",
        "count": "[variables('regionCount')]",
        "input": "[concat('r',copyIndex('regionSuffix',1))]"
      },
      {
        "name": "eventHubName",
        "count": "[variables('regionCount')]",
        "input": "[concat(variables('appName'),'ehub-',variables('regionSuffix')[copyIndex('eventHubName')],'-',parameters('environment'))]"
      }
    ]
  },
  "resources": [
   
    {
      "type": "Microsoft.EventHub/namespaces",
      "apiVersion": "[variables('eventHubNMApiVersion')]",
      "name": "[variables('eventHubName')[copyIndex()]]",
      "copy": {
        "name": "resourceLoop",
        "count": "[variables('regionCount')]"
      },
      "location": "[variables('location')[copyIndex()]]",
      "sku": {
        "name": "Standard",
        "tier": "Standard",
        "capacity": 1
      },
      "properties": {
        "zoneRedundant": false,
        "isAutoInflateEnabled": true,
        "maximumThroughputUnits": 1,
        "kafkaEnabled": true
      },
      "resources": [
        {
          "type": "Microsoft.EventHub/namespaces/eventhubs",
          "apiVersion": "[variables('eventHubApiVersion')]",
          "name": "[concat(variables('eventHubName')[copyIndex()], '/',parameters('progressRecordsEventHubName'))]",
          "location": "[variables('location')[copyIndex()]]",
          "dependsOn": [
            "[resourceId('Microsoft.EventHub/namespaces', variables('eventHubName')[copyIndex()])]"
          ],
          "properties": {
            "messageRetentionInDays": 3,
            "partitionCount": 1,
            "status": "Active"
          },
          "resources": [
            {
              "type": "Microsoft.EventHub/namespaces/eventhubs/authorizationRules",
              "apiVersion": "[variables('eventHubApiVersion')]",
              "name": "[concat(variables('eventHubName')[copyIndex('resourceLoop')], '/',parameters('progressRecordsEventHubName'),'/Listen')]",
              "location": "[variables('location')[copyIndex()]]",
              "dependsOn": [
                "[resourceId('Microsoft.EventHub/namespaces/eventhubs', variables('eventHubName')[copyIndex()],parameters('progressRecordsEventHubName'))]"
              ],
              "properties": {
                "rights": [
                  "Listen"
                ]
              }
            },
            {
              "type": "Microsoft.EventHub/namespaces/eventhubs/authorizationRules",
              "apiVersion": "[variables('eventHubApiVersion')]",
              "name": "[concat(variables('eventHubName')[copyIndex('resourceLoop')], '/',parameters('progressRecordsEventHubName'),'/Send')]",
              "location": "[variables('location')[copyIndex()]]",
              "dependsOn": [
                "[resourceId('Microsoft.EventHub/namespaces/eventhubs', variables('eventHubName')[copyIndex()], parameters('progressRecordsEventHubName'))]"
              ],
              "properties": {
                "rights": [
                  "Send"
                ]
              }
            }
          ]
        }
      ]
    }      
  ],
  "functions": [    
  ],
  "outputs": {}
}

现在当我 运行 Test-AzureRmResourceGroupDeployment 时此模板失败(添加 -Debug 以查看真正的错误) 错误:

Test-AzureRmResourceGroupDeployment : Encountered internal server error. Diagnostic information: timestamp '20201119T072227Z' ......

经过一些故障排除后,我发现删除模板中的第二条身份验证规则可以解决问题。 我实际上需要不止 1 个授权规则。是什么导致上述模板失败?我似乎找不到任何问题。 您可以在下面找到成功的模板 - 在事件中心有 1 个授权规则

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {    
    "location-region1": {
      "type": "string",
      "defaultValue": "eastus"
    },
    "location-region2": {
      "type": "string",
      "defaultValue": "westus2"
    },   
    "appName": {
      "type": "string",
      "defaultValue": "jklm",
      "metadata": {
        "description": "Short name of the app or service"
      }
    },
    "uniqueSuffix": {
      "type": "string",
      "defaultValue": "tst",
      "metadata": {
        "description": "Unique Suffix to use for the azure resources of the app or service"
      }
    },
    "environment": {
      "type": "string",
      "defaultValue": "int",
      "allowedValues": [
        "poc",
        "dev",
        "int",
        "uat",
        "prod"
      ],
      "metadata": {
        "description": "The name of the environment"
      }
    },   
    "progressRecordsEventHubName": {
      "type": "string",
      "defaultValue": "progressrecords"
    }
  },
  "variables": {    
    "eventHubNMApiVersion": "2018-01-01-preview",
    "eventHubApiVersion": "2017-04-01",    
    "parentResourceGroupName": "[resourceGroup().name]",
    "regionCount": 2,  
    "location": [
      "[parameters('location-region1')]",
      "[parameters('location-region2')]"
    ],   
    "appName": "[concat(parameters('appName'),'-',parameters('uniqueSuffix'),'-')]",   
    "copy": [
      {
        "name": "regionSuffix",
        "count": "[variables('regionCount')]",
        "input": "[concat('r',copyIndex('regionSuffix',1))]"
      },
      {
        "name": "eventHubName",
        "count": "[variables('regionCount')]",
        "input": "[concat(variables('appName'),'ehub-',variables('regionSuffix')[copyIndex('eventHubName')],'-',parameters('environment'))]"
      }
    ]
  },
  "resources": [
   
    {
      "type": "Microsoft.EventHub/namespaces",
      "apiVersion": "[variables('eventHubNMApiVersion')]",
      "name": "[variables('eventHubName')[copyIndex()]]",
      "copy": {
        "name": "resourceLoop",
        "count": "[variables('regionCount')]"
      },
      "location": "[variables('location')[copyIndex()]]",
      "sku": {
        "name": "Standard",
        "tier": "Standard",
        "capacity": 1
      },
      "properties": {
        "zoneRedundant": false,
        "isAutoInflateEnabled": true,
        "maximumThroughputUnits": 1,
        "kafkaEnabled": true
      },
      "resources": [
        {
          "type": "Microsoft.EventHub/namespaces/eventhubs",
          "apiVersion": "[variables('eventHubApiVersion')]",
          "name": "[concat(variables('eventHubName')[copyIndex()], '/',parameters('progressRecordsEventHubName'))]",
          "location": "[variables('location')[copyIndex()]]",
          "dependsOn": [
            "[resourceId('Microsoft.EventHub/namespaces', variables('eventHubName')[copyIndex()])]"
          ],
          "properties": {
            "messageRetentionInDays": 3,
            "partitionCount": 1,
            "status": "Active"
          },
          "resources": [
            {
              "type": "Microsoft.EventHub/namespaces/eventhubs/authorizationRules",
              "apiVersion": "[variables('eventHubApiVersion')]",
              "name": "[concat(variables('eventHubName')[copyIndex('resourceLoop')], '/',parameters('progressRecordsEventHubName'),'/Listen')]",
              "location": "[variables('location')[copyIndex()]]",
              "dependsOn": [
                "[resourceId('Microsoft.EventHub/namespaces/eventhubs', variables('eventHubName')[copyIndex()],parameters('progressRecordsEventHubName'))]"
              ],
              "properties": {
                "rights": [
                  "Listen"
                ]
              }
            }
          ]
        }
      ]
    }      
  ],
  "functions": [    
  ],
  "outputs": {}
}

这篇文章可能有用:https://www.rickvandenbosch.net/blog/error-creating-service-bus-authorization-rules-using-arm/

我认为模板不会期望相同的资源两次,因为这些 Listen, Send 授权规则可以像下面这样组合:

          "resources": [
            {
              "type": "Microsoft.EventHub/namespaces/eventhubs/authorizationRules",
              "apiVersion": "[variables('eventHubApiVersion')]",
              "name": "[concat(variables('eventHubName')[copyIndex('resourceLoop')], '/',parameters('progressRecordsEventHubName'),'/Listen')]",
              "location": "[variables('location')[copyIndex()]]",
              "dependsOn": [
                "[resourceId('Microsoft.EventHub/namespaces/eventhubs', variables('eventHubName')[copyIndex()],parameters('progressRecordsEventHubName'))]"
              ],
              "properties": {
                "rights": [
                  "Listen",
                  "Send"
                ]
              }
            },

在这方面与 Azure 支持人员合作。 Azure 端存在问题。它今天(11/19/2020)自动解决。模板不再因多个身份验证规则而失败。