【问题标题】:Azure ARM "code": "InUseSubnetCannotBeDeleted" when trying to update vnetAzure ARM“代码”:尝试更新 vnet 时出现“InUseSubnetCannotBeDeleted”
【发布时间】:2019-04-29 10:44:59
【问题描述】:

我有一个相当简单的 ARM 模板,用于创建 vnet、子网和服务端点。当我尝试更改服务端点时,我收到错误“代码”:“InUseSubnetCannotBeDeleted”。说明我的一台虚拟机正在使用其中一个子网。但是,我不想删除该子网。我只是想更新它,我可以通过门户或 powershell 进行的操作就可以了。是否需要更改某些开关以使 ARM 模板更新资源而不是从头开始创建它们?

模板。我把它剥离到最低限度。首先我使用它来创建 vnet 和两个子网,部署一个 VM,然后再次运行部署,我得到子网无法删除:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vnetName": {
      "type": "string",
      "defaultValue": "VNet1",
      "metadata": {
        "description": "VNet name"
      }
    },
    "vnetAddressPrefix": {
      "type": "string",
      "defaultValue": "10.0.0.0/16",
      "metadata": {
        "description": "Address prefix"
      }
    },
    "subnets": {
      "type": "object"
    }
  },
  "variables": {
    "location": "[resourceGroup().location]",
    "subnetcount": "[length(parameters('subnets').settings)]"
  },
  "resources": [
    {
      "apiVersion": "2018-06-01",
      "type": "Microsoft.Network/virtualNetworks",
      "name": "[parameters('vnetName')]",
      "location": "[variables('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": ["[parameters('vnetAddressPrefix')]"]
        }
      },
      "resources": [
      ]
    },
    {
      "apiVersion": "2018-06-01",
      "type": "Microsoft.Network/virtualNetworks/subnets",
      "name": "[concat(parameters('vnetName') , '/' , parameters('subnets').settings[copyIndex()].name)]",
      "location": "[variables('location')]",
      "copy": {
        "name": "subnetLoop",
        "count": "[variables('subnetcount')]"
      },
      "dependsOn": ["[parameters('vnetName')]"],
      "properties": {
        "addressPrefix": "[parameters('subnets').settings[copyIndex()].addressPrefix]"
      }
    }
  ]
}

【问题讨论】:

    标签: azure azure-resource-manager arm-template


    【解决方案1】:

    我遇到了同样的问题。这是我找到的,和上面其他用户的答案基本相同。

    在 ARM 模板中创建具有子网的 vnet 的三种方法。 (非常粗略的例子

    1。第一次运行时工作。之后,vnet 资源会尝试删除子网。

    {
      "vnet"
    },
    {
      "subnet",
      "dependsOnVnet"
    }
    

    2。即使它们是嵌套资源,vnet 也没有上下文感知。类似于选项 #1。

    {
      "vnet"
      resources : [
        {
          "subnet",
          "dependsOnVnet"
        }
      ]
    }
    

    3。 vnet 资源是子网感知的,因为它是 vnet 的属性。它不会删除子网。

    {
      "vnet"
      "properties":{
        "subnets" : ["subnet"]
      }
    }
    

    *这些示例使用增量 ARM 部署。*

    【讨论】:

      【解决方案2】:

      我怀疑问题是你从模板中遗漏了一些东西,现在它试图删除它。很难确切地判断这里出了什么问题,但是如果您尝试更新现有子网,则需要确保 vnet 中存在的所有子网都实际存在于模板中。如果某些子网被遗漏,它会尝试删除它们

      【讨论】:

      • 这也是我的想法,但我实际上是在使用相同的参数进行两次相同的部署。我只是在中间添加虚拟机。
      • 我怀疑是因为您的 vnet 没有子网属性,它会尝试删除所有子网
      • 所以使用属性循环可以解决这个问题?
      • 是的,它会修复它,如果循环创建一个适当的子网结构
      【解决方案3】:

      Alex 的回答 #3 是这个问题的正确解决方案。我想添加对子网的更改(如名称)也会触发删除/创建。这在错误消息中并不明显,但如果您运行 what-if 操作以查看 Azure 正在发生的变化 (documentation),则很容易看到。

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 2019-07-12
        相关资源
        最近更新 更多