Azure ARM模板嵌套模板部署不会更新资源\启动失败

Azure ARM模板嵌套模板部署不会更新资源\启动失败,azure,azure-resource-manager,Azure,Azure Resource Manager,我有以下ARM模板结构: Parent Template |--Nested Template 1 |--... |--Nested Template 6 所以我只有两层模板,父模板和嵌套模板 假设我将父级部署到一个空的资源组,并且一切正常。在此之后,我删除了其中一个资源,并希望使用相同的参数部署相同的父模板,以恢复删除的资源。但是部署会失败,因为资源已经存在,而不是我试图重新创建的资源。我尝试了增量模式和完全模式进行部署。 若我直接调用缺少资源的嵌套模板,它将按预期工作,所以具

我有以下ARM模板结构:

Parent Template
  |--Nested Template 1 
  |--...
  |--Nested Template 6
所以我只有两层模板,父模板和嵌套模板

假设我将父级部署到一个空的资源组,并且一切正常。在此之后,我删除了其中一个资源,并希望使用相同的参数部署相同的父模板,以恢复删除的资源。但是部署会失败,因为资源已经存在,而不是我试图重新创建的资源。我尝试了增量模式和完全模式进行部署。 若我直接调用缺少资源的嵌套模板,它将按预期工作,所以具体地说,只使用嵌套模板创建部署,而不使用调用嵌套模板的父级

UPD: 经过一些额外的测试,我可以得出结论,这比以前更奇怪。因此,我将使用powershell启动此部署:

新AzureRmResourceGroupDeployment@parameters

它部署得很好,但是如果在第一次部署完成后调用相同的命令,则会出现错误:

位置中已存在资源“gggg-1s-The-wordd” 资源组“gggg”中的“西欧”。具有相同名称的资源 无法在位置“northeurope”中创建。请选择一个新的 资源名称

这种行为例外吗?我似乎找不到任何相关的,谢谢


UPD2:如果我使用portal或powershell并不重要,我会得到相同的错误。

如果您故意部署相同的资源,而没有将word模板用于相同的资源组,Azure应该这样做。注意,如果它不在那里,它会创建它,如果它在那里,它应该不起作用。它不是黑白的,有一些细微差别,比如如果资源存在,您不能更改某些属性,但是如果您将具有相同属性值的同一资源部署到同一资源组,您不应该得到错误

一般来说,嵌套与否都不应该影响这些

如果要部署到不同的资源组,则可能会看到关于已存在的错误,具体取决于资源


综上所述,在你的具体案例中,如果没有更多细节,真的很难说出发生了什么。。。因此,如果这没有帮助,您能否添加一些详细信息?我们可以看到问题的确切错误消息或复制模板是什么?

因此,在Brian的帮助下,我们能够识别罪犯。问题是WebApp的位置设置为resourcegroup.location,而应用服务计划从参数中正确获取位置。因此,在部署时,Webapp将部署到应用程序服务计划的地区,但在评估的时候,它会认为这个Webapp属于资源组的区域。
TLDR-复制粘贴错误,再加上ARM中的位置评估错误,导致了一个非常奇怪的行为。

我也遇到了同样的问题。原因是,应用程序服务的位置被定义为[resourceGroup.location],而不是造成问题的应用程序服务计划ASP位置。我通过将ASP的位置作为参数传递给模板对其进行了更改

获取ASP的位置如下所示:

internal static string GetASPLocation(TokenCloudCredentials credentials, string resourceGroup, string ASP)
    {
        Console.WriteLine($"Getting location of App Service Plan {ASP} in Resource Group {resourceGroup}");
        var resourceClient = new ResourceManagementClient(credentials);
        ResourceExistsResult result = resourceClient.Resources.CheckExistence(resourceGroup, new ResourceIdentity(ASP, "Microsoft.Web/serverfarms", "2015-08-01"));
        var appServicePlan = resourceClient.Resources.Get(resourceGroup, new ResourceIdentity(ASP, "Microsoft.Web/serverfarms", "2015-08-01"));
        return appServicePlan.Resource.Location;
    }
在ARM模板中,位置可以更改为:

"location": "[parameters('ASPLocation')]"

“重新部署”只是使用相同的模板和参数启动一个新的部署,因此,它与门户或PowerShell中的单独部署执行相同的操作是有意义的。但它没有意义,因为resourceGroup函数在嵌套模板和链接模板之间解析的方式不同。基本上,在嵌套模板中,指定resourcegroup会获取主模板的resourcegroup,因此如果使用resourcegroup.location,则可能指向错误的位置。下面的文档对此进行了很好的解释。我已经添加了更多的细节,如果您需要更多的数据,请您亲自查看并与我联系,好吗?我的twitter昵称和这里一样。谢谢我不是一个很会发推特的人,但如果你想给我发电子邮件,我很乐意深入了解。。。我认为这是一个bug,应该这样处理。这不是您的复制粘贴错误。如果您已经指定了托管计划名称,那么应该使用resourceGroup.location,但是,此错误会迫使您重复并传递位置。在我的例子中,我已经有了一个计划,我只使用了一个简单的模板,猜猜看,我需要告诉那个网站将要去哪里。。所有这些ARM模板感觉就像是一个不知道如何管理资源IRL的人在10分钟内完成的。PS验证器甚至不工作。PS验证器是一堆垃圾,它只测试基本语法错误