Azure ARM 模板嵌套模板部署不会更新 resources\fails 以启动

Azure ARM template nested template deployment won't update resources\fails to start

我有以下 ARM 模板结构:

Parent Template
  |--Nested Template 1 
  |--...
  |--Nested Template 6

所以我只有 2 层模板,父模板和嵌套模板。

假设我将 parent 部署到一个空资源组并且一切正常。之后,我删除了其中一个资源,并希望部署具有相同参数的相同父模板以恢复已删除的资源。但是部署会失败,说资源已经存在(另一个,不是我试图重新创建的资源)。我尝试了增量模式和完整模式进行部署。 如果我直接调用带有缺失资源的嵌套模板,它会按预期工作(因此专门创建一个仅包含嵌套模板的部署,而不是包含调用嵌套模板的父项的部署)。

更新: 经过一些额外的测试后,我可以得出结论,这比以前更奇怪了。所以我开始使用 powershell 进行部署:

New-AzureRmResourceGroupDeployment @parameters

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

The resource 'gggg-1s-the-wordd' already exists in location 'westeurope' in resource group 'gggg'. A resource with the same name cannot be created in location 'northeurope'. Please select a new resource name.

这种行为是否例外?我似乎找不到任何相关的东西,谢谢!

UPD2:无论我使用 portal 还是 powershell,我都会得到同样的错误。

如果您将相同的资源(有意没有在那里使用 "template" 这个词)部署到相同的资源组,Azure 应该 "make it so"。 IOW,如果它不存在,它将创建它,如果它存在,它应该没有操作。这并不是说黑白之间有一些细微差别(比如如果资源存在则不能更改某些属性)但是如果您将具有相同 属性 值的相同资源部署到相同的资源组,您不应该得到错误。

一般来说,嵌套(或不嵌套)应该不会影响这些。

如果您要部署到不同的资源组,则可能会看到关于 "already exists" 的错误,具体取决于资源。

综上所述,如果没有更多细节,真的很难说出你的具体情况发生了什么......所以如果这没有帮助,你能否添加一些细节(确切的错误消息是什么)或重现(我们可以看到问题的模板)?

因此,在 Brian 的帮助下,我们确定了罪魁祸首。问题是 WebApp 将其位置设置为 resourcegroup().location 而 App Service Plan 正确地从参数获取位置。所以这会导致一个问题,即在部署时 WebApp 将部署到其 App Service Plan 所在的区域,但在评估时它会认为此 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')]"