Azure ARM "code":尝试更新 vnet 时 "InUseSubnetCannotBeDeleted"
Azure ARM "code": "InUseSubnetCannotBeDeleted" when trying to update vnet
我有一个相当简单的 ARM 模板,用于创建 vnet、子网和服务端点。当我尝试更改服务端点时,出现错误 "code":"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]"
}
}
]
}
我怀疑问题是您遗漏了模板中的某些内容,现在它正试图将其删除。很难说出这里到底出了什么问题,但是如果您尝试更新现有的子网,则需要确保 vnet 中存在的所有子网实际上都存在于模板中。如果遗漏了一些子网,它将尝试删除它们
我运行遇到了同样的问题。这是我查到的,和上面那个用户的回答基本一样。
在 ARM 模板中创建带子网的 vnet 的三种方法。
(非常粗糙的例子)
1。第一次运行时有效。之后,vnet 资源尝试删除子网。
{
"vnet"
},
{
"subnet",
"dependsOnVnet"
}
2。即使它们是嵌套资源,vnet 也没有上下文感知。类似于选项 #1。
{
"vnet"
resources : [
{
"subnet",
"dependsOnVnet"
}
]
}
3。 vnet 资源是子网感知的,因为它是 vnet 的 属性。它不会删除子网。
{
"vnet"
"properties":{
"subnets" : ["subnet"]
}
}
*这些示例是增量 ARM 部署。*
Alex 的答案 #3 是这个问题的正确答案。我想补充一点,对子网的更改(如名称)也会触发 delete/create。这在错误消息中并不明显,但如果您 运行 一个 what-if
操作以查看 Azure 正在更改的内容 (documentation).
,则很容易看出
我有一个相当简单的 ARM 模板,用于创建 vnet、子网和服务端点。当我尝试更改服务端点时,出现错误 "code":"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]"
}
}
]
}
我怀疑问题是您遗漏了模板中的某些内容,现在它正试图将其删除。很难说出这里到底出了什么问题,但是如果您尝试更新现有的子网,则需要确保 vnet 中存在的所有子网实际上都存在于模板中。如果遗漏了一些子网,它将尝试删除它们
我运行遇到了同样的问题。这是我查到的,和上面那个用户的回答基本一样。
在 ARM 模板中创建带子网的 vnet 的三种方法。 (非常粗糙的例子)
1。第一次运行时有效。之后,vnet 资源尝试删除子网。
{
"vnet"
},
{
"subnet",
"dependsOnVnet"
}
2。即使它们是嵌套资源,vnet 也没有上下文感知。类似于选项 #1。
{
"vnet"
resources : [
{
"subnet",
"dependsOnVnet"
}
]
}
3。 vnet 资源是子网感知的,因为它是 vnet 的 属性。它不会删除子网。
{
"vnet"
"properties":{
"subnets" : ["subnet"]
}
}
*这些示例是增量 ARM 部署。*
Alex 的答案 #3 是这个问题的正确答案。我想补充一点,对子网的更改(如名称)也会触发 delete/create。这在错误消息中并不明显,但如果您 运行 一个 what-if
操作以查看 Azure 正在更改的内容 (documentation).