Microsoft.Web/sites/hostNameBindings资源的ARM模板部署使用复制

ARM template deployment of Microsoft.Web/sites/hostNameBindings resources using copy

我对一系列 Azure 数据中心位置使用复制操作,以便为每个位置部署应用程序服务计划和网站。我能够创建流量管理器配置文件并使用复制对象将每个位置的端点添加到流量管理器配置文件。

当我尝试根据说明使用 Microsoft.Web/sites/hostNameBindings 资源将每个网站的 CNAME 设置为我的自定义域名时 here 我想到了以下内容:

   {
      "type": "Microsoft.Web/sites/hostNameBindings",
      "apiVersion": "[parameters('hostNameBindingsApiVersion')]",
      "copy": {
        "name": "hostNameBindingsEndpointsLoop",
        "count": "[length(parameters('appServicePlanLocations'))]"
      },
      "name": "[concat(concat(variables('webSitePrefix'), parameters('appServicePlanLocations')[copyIndex()]), '/', variables('hostNameBindingsName'))]",
      "location": "[parameters('appServicePlanLocations')[copyIndex()]]",
      "dependsOn": [
        "[concat('Microsoft.Network/trafficManagerProfiles/', variables('trafficManagerName'), '/azureEndpoints/', variables('trafficManagerEndpointPrefix'), parameters('appServicePlanLocations')[copyIndex()])]",
        "[concat('Microsoft.Web/sites/', concat(variables('webSitePrefix'), parameters('appServicePlanLocations')[copyIndex()]))]"
      ],
      "properties": {
        "siteName": "[concat(variables('webSitePrefix'), parameters('appServicePlanLocations')[copyIndex()])]",
        "domainId": null,
        "hostNameType": "Verified"
      }
    }

使用它,实际上设置了 CNAME,但 ARM 模板部署失败并出现以下错误:

{
      "ErrorEntity": {
        "Code": "Conflict",
        "Message": "Cannot modify this site because another operation is in progress. Details: Id: {guid}, OperationName: RegisterTrafficManagerProfile, CreatedTime: 5/24/2016 11:13:54 PM, RequestId: {guid}, EntityType: 1",
        "ExtendedCode": "59203",
        "MessageTemplate": "Cannot modify this site because another operation is in progress. Details: {0}",
        "Parameters": [
          "Id: {guid}, OperationName: RegisterTrafficManagerProfile, CreatedTime: 5/24/2016 11:13:54 PM, RequestId:{guid}, EntityType: 1"
        ],
        "InnerErrors": null
      }
    }
  ],
  "Innererror": null
}

我不确定冲突是什么,因为我添加了 dependson 段以尝试等待网站创建以及 trafficmanagerendpoint 完成其配置。我将尝试更改顺序,以便在创建网站后添加 CNAME,然后让流量管理器端点等待 CNAME 创建。我不明白为什么顺序会有所不同。

我是否正确定义了我的 arm 模板的 Microsoft.Web/sites/hostNameBindings 部分?在这种情况下依赖顺序重要吗?应该吗?

当您将 Web 应用程序添加到流量管理器时,两种服务之间会在后台发生一些异步协调,以检查 Web 应用程序 SKU 是否符合流量管理器的条件并注册流量管理器 DNS 名称在 Web App 自定义域名列表中。

看来是这个异步进程导致了您看到的错误。您关于颠倒顺序的建议,因此您的 CNAME 是在流量管理器注册之前创建的,应该有效(我很想知道是否有效)。

Jonathan Tuliani,Azure 网络 - DNS 和流量管理器项目经理

如其他人所述,流量管理器似乎导致异步 hostNameBindings 迭代操作出现问题。

可以通过使用"mode": "serial"模式指定同步副本来解决"batchsize": 1:

{
   "type": "Microsoft.Web/sites/hostNameBindings",
   "apiVersion": "[parameters('hostNameBindingsApiVersion')]",
   "copy": {
     "name": "hostNameBindingsEndpointsLoop",
     "count": "[length(parameters('appServicePlanLocations'))]",

     /* FIX for Asynchronous Hostname Conflict */
     "mode": "serial",
     "batchSize": 1
  },
  …

可在此处找到 "mode""batchSize" 属性的说明:

https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#resource-iteration