Azure ARM 模板想要删除现有的子网资源

Azure ARM template wants to delete existing subnet resource

我正在尝试 setup/configure PostgreSQL 在 Azure 上使用 ARM 模板。 此外,在我的模板中,我正在使用带有子网的现有 VNET。

一切都按预期进行,直到我尝试添加 virtualNetworkRules。当我尝试添加网络规则时出现错误:

Subnets XXXXX of virtual network /subscript.../virtualNetworks/XXXXXX do not have ServiceEndpoints for Microsoft.Sql resources configured. Add Microsoft.Sql to subnet's ServiceEndpoints collection before trying to ACL Microsoft.Sql resources to these subnets.

所以,我决定在模板中添加 Microsoft.Network/virtualNetworks 部分。

我的 VNET 有 3 个子网。这 3 个子网之一有我的 PSQL 数据库。

我添加了这个部分:

...

"resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2020-06-01",
      "name": "VNETNAME",
      "location": "LOCATION",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "XXX"
          ]
        }
      },
      "resources": [
        {
          "type": "subnets",
          "apiVersion": "2020-06-01",
          "name": "subnetName",
          "location": "LOCATION",
          "dependsOn": [
            "VNETNAME"
          ],
          "properties": {
            "addressPrefix": "YYY",
            "serviceEndpoints": [
              {
                "service": "Microsoft.Sql",
                "locations": [
                  "*"
                ]
              }
            ]
          }
        }
      ]
    },
 ...

然后我得到一个错误:

...499791aac1e995 and cannot be deleted. In order to delete the subnet, delete all the resources within the subnet. See aka.ms/deletesubnet."}}, "target_resou ...

因此,出于某种原因,它想要破坏(或重新创建?)我的子网。有什么想法吗?

我的意见 - 也许我错过了一些已经存在于子网中但未在我的模板中定义的属性?如果是这样 - 有没有办法设置一些特殊标志以不修改模板中未指定的任何现有资源?或类似的东西?或任何其他解决方案?

在您的问题中您声明您有 3 个子网,但在 ARM 模板的片段中您只定义了 1 个(作为 virtualNetwork 的子资源)。部署 virtualNetwork 资源时,只会创建该资源中定义的子网,并删除任何未定义的子网(如果可能,如果资源附加到未定义的子网,则会出现错误).

有两种方法可以解决这个问题:

  1. 在部署虚拟网络的ARM模板中定义所有子网。根据使用虚拟网络的其他项目和资源,您可能会发现在不同的 ARM 模板中执行此操作很有意义

  2. 不要在模板中定义虚拟网络,只需像这样定义对本次部署重要的子网:

"resources": [
    {
        "type": "Microsoft.Network/virtualNetworks/subnets",
        "apiVersion": "2020-06-01",
        "name": "VNETNAME/subnetName",
        "location": "LOCATION",
        "properties": {
            "addressPrefix": "YYY",
            "serviceEndpoints": [
                {
                    "service": "Microsoft.Sql",
                    "locations": [
                        "*"
                    ]
                }
            ]
        }
    }
],

但请注意,如果尝试部署虚拟网络是从另一个模板进行的,并且它不包含您的子网的定义,它会抛出错误或删除子网(取决于是否附加了任何内容).