如何更改现有Azure应用程序网关的VNet和子网?

12

是否有可能将已设置的应用网关从一个子网移动到另一个子网?

目前还没有在门户中看到这样的操作方式。

5个回答

14
您可以使用此脚本更改虚拟网络或子网。在将其应用于生产网关之前,请测试一下以确保它符合您的需求。还要注意,在更改期间会有一些停机时间。
#Login to Azure RM
Login-AzureRmAccount

#Get the Application Gateway config
$gw=Get-AzureRmApplicationGateway -Name GatewayName -ResourceGroupName RGName

#Set the new virtual network and store the config into a new variable
$gw2=Set-AzureRmApplicationGatewayIPConfiguration -SubnetId "/subscriptions/999999-9915-4b1c-accf-0c984bed2311/resourceGroups/RGName/providers/Microsoft.Network/virtualNetworks/NewVirtualNetwork/subnets/default" -ApplicationGateway $gw -Name $gw.GatewayIPConfigurations.name

#Stop the Gateway (you can't change the virtual network / subnet if the Gateway is running)
Stop-AzureRmApplicationGateway -ApplicationGateway $gw

#Set the new config
Set-AzureRmApplicationGateway -ApplicationGateway $gw2

建议:首先使用 $subnet = Get-AzureRmVirtualNetworkSubnetConfig 获取子网,然后使用 -Subnet 参数。这是更符合 PowerShell 风格和面向对象的方法。 - Jari Turkia
是的,这可以更改外部IP地址。应用程序网关的外部IP地址始终是动态的。当网关停止时,当前的外部地址会被释放,并且在再次启动网关时不太可能分配相同的外部地址。 - Eugene Rosenfeld
这个脚本向我报告说,FrontendIpConfiguration不能与网关子网不同。有没有一种同时更改两者的方法? - Bron Davies
如果你想知道如何处理FrontendIpConfiguration问题,我在门户中手动删除了私有前端IP配置,然后就可以运行这个脚本了。之后,我重新创建了私有前端IP配置以使用新的子网。 - Bron Davies
看到这个可以在几行代码中轻松完成,我想知道是什么阻止了微软在门户中提供手动执行此操作的选项? - Dan Z
显示剩余2条评论

14

andresm53的回答是很好的。
然而,由于PowerShell AzureRm模块正在被新的Az模块所取代,因此这里提供了一个Az版本(稍作改进以避免需要查找子网ID并将其粘贴到代码中)。
除了andresm53的代码之外,还基于MS文档中的示例。

### Fill in your values ###
$GatewayResourceGroupName = "MyRG1"
$GatewayName = "MyGw"
$VnetResourceGroupName = "MyRG2"  #may or may not be the same as $GatewayResourceGroupName
$VNetName = "MyVNet"
$SubnetName = "Subnet1"
###########################

$AppGw = Get-AzApplicationGateway -Name $GatewayName -ResourceGroupName $GatewayResourceGroupName
Stop-AzApplicationGateway -ApplicationGateway $AppGw
$VNet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $VnetResourceGroupName
$Subnet = Get-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $VNet
$AppGw = Set-AzApplicationGatewayIPConfiguration -ApplicationGateway $AppGw -Name  $AppGw.GatewayIPConfigurations[0].Name -Subnet $Subnet
Set-AzApplicationGateway -ApplicationGateway $AppGw
Start-AzApplicationGateway -ApplicationGateway $AppGw

我无法使用 Get-AzVirtualNetworkSubnetConfig 找到我的(新创建的)子网(不确定是否需要先包含一些内容?)。在 Set-AzApplicationGatewayIPConfiguration 命令中设置 SubnetId(像 @andresm53 一样),这样可以解决问题。 - Marcel
这很完美,第一次就成功了。 - Ian1971

11

我使用 Azure CLI 完成了这项任务,需要执行以下步骤:

  1. 停止应用网关
  2. 更改子网
  3. 启动应用网关(这可能需要几分钟)

使用 Azure CLI:

1. 停止应用网关

az network application-gateway stop --subscription YOUR_SUBSCRIPTION_NAME --resource-group YOUR_APP_GATEWAY_RESOURCE_GROUP --name YOUR_APP_GATEWAY_NAME

2. 更改子网。

2.1 在这一步,您需要知道下一个命令给出的当前vnet数据。

az network application-gateway show \
  --subscription YOUR_SUBSCRIPTION_NAME \
  --resource-group YOUR_APP_GATEWAY_RESOURCE_GROUP \
  --name YOUR_APP_GATEWAY_NAME

我们需要的输出位于JSON部分的gatewayIpConfigurations。
[
    {
      "etag": "REDACTED",
      "id": "REDACTED",
      "name": "REDACTED",
      "provisioningState": "REDACTED",
      "resourceGroup": "REDACTED",
      "subnet": {
        "id": "/subscriptions/REDACTED/resourceGroups/REDACTED/providers/Microsoft.Network/virtualNetworks/YOUR_CURRENT_VNET/subnets/YOUR_CURRENT_SUBNET",
        "resourceGroup": "REDACTED"
      },
      "type": "Microsoft.Network/applicationGateways/gatewayIPConfigurations"
    }
  ]

2.2 如果要更改子网,您需要将 YOUR_CURRENT_SUBNET 修改为新的子网

[
    {
      "etag": "REDACTED",
      "id": "REDACTED",
      "name": "REDACTED",
      "provisioningState": "REDACTED",
      "resourceGroup": "REDACTED",
      "subnet": {
        "id": "/subscriptions/REDACTED/resourceGroups/REDACTED/providers/Microsoft.Network/virtualNetworks/YOUR_CURRENT_VNET/subnets/YOUR_NEW_SUBNET",
        "resourceGroup": "REDACTED"
      },
      "type": "Microsoft.Network/applicationGateways/gatewayIPConfigurations"
    }
  ]

2.3 复制之前的子网 ID,输入你想要的子网名称,然后更新它。
az network application-gateway update \
  --subscription YOUR_SUBSCRIPTION_NAME \
  --resource-group YOUR_APP_GATEWAY_RESOURCE_GROUP \
  --name YOUR_APP_GATEWAY_NAME \
  --set gatewayIpConfigurations[0].subnet.id='/subscriptions/REDACTED/resourceGroups/REDACTED/providers/Microsoft.Network/virtualNetworks/YOUR_CURRENT_VNET/subnets/YOUR_NEW_SUBNET'

3. 启动应用程序网关

az network application-gateway start \
  --subscription YOUR_SUBSCRIPTION_NAME \
  --resource-group YOUR_APP_GATEWAY_RESOURCE_GROUP \
  --name YOUR_APP_GATEWAY_NAME

3
不确定此时是否已经测试过,但我现在尝试了一下,你在2.3处的命令无效。它不需要完整的JSON信息数组,只需要新的子网ID即可。 - Alex Pilon
谢谢提醒,我会尽快查看。 - Jose Mato
1
az network application-gateway update --resource-group MyResourceGroup --name my-application-gateway --set gatewayIpConfigurations[0].subnet.id="/subscriptions/SOME-UUID/resourceGroups/SOME_RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/SOME_VNET_NAME/subnets/SOME_SUBNET_NAME" 对我来说是可行的。 - David Goodwin
请记住,停止/启动将释放并更新您的公共IP地址(除非它是静态的)。 - avs099
2.3 对我没有起作用,我不得不做这样的事情:az network application-gateway update --resource-group REDACTED --name REDACTED --set properties.gatewayIPConfigurations[0].properties.subnet.id=/subscriptions/REDACTED/resourceGroups/REDACTED/providers/Microsoft.Network/virtualNetworks/foo-Prod-vnet/subnets/foo-appgateway - Adam Hardy

2

正在运行的网关无法更改子网 / 虚拟网络关联。它需要先停止状态。一旦更新后启动,网关上的VIP也会更改。可以通过PowerShell / CLI移动子网,目前在门户中不支持。


2
你如何停止正在运行的应用程序网关? - Frank Fu

0

这将影响外部IP地址。因此,应用程序网关必须使用动态IP地址。

一旦应用程序网关停止,外部IP地址将被释放,因此在启动后您将获得一个新的IP地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接