将 Azure 应用程序网关和 Web 应用程序防火墙从 V1 迁移到 V2

在 2023 年 4 月 28 日,我们已宣布弃用应用程序网关 V1 SKU(标准和 WAF)。 V1 SKU 将于 2026 年 4 月 28 日停用。 有关详细信息,请参阅 在 2026 年 4 月 28 日前将应用程序网关从 V1 SKU 迁移到 V2 SKU

与 V1 相比,Azure 应用程序网关和 Web 应用程序防火墙 (WAF) V2 提供更多的功能和更优越的特性,例如自动缩放、可用性、区域冗余、更高的性能、更快的操作速度和更高的吞吐量。 此外,所有新功能都是针对 V2 SKU 发布的。 强烈建议立即制定迁移计划。

V1 网关不会自动升级到 V2。 使用此迁移指南帮助你规划和执行迁移。

迁移分为两个阶段:

  1. 迁移配置
  2. 迁移客户端流量

本文主要帮助你完成配置迁移。 客户端流量迁移过程因环境而异。 本文提供了一些常规建议

先决条件

  • 具有活动订阅的 Azure 帐户。 创建帐户
  • 现有应用程序网关 V1 标准版。
  • 确保你有最新的 PowerShell 模块。
  • 如果在本地运行 PowerShell,则还需运行 Connect-AzAccount -Environment AzureChinaCloud 以创建与 Azure 的连接。
  • 确保 V1 订阅中没有具有提供的 AppGW V2 名称和资源组名称的现有应用程序网关。 这会重写现有资源。
  • 如果提供了公共 IP 地址,请确保其处于成功状态。 如果未提供它且提供了 AppGWResourceGroupName,请确保 V1 订阅中名为 AppGWResourceGroupName 的资源组中不存在名为 AppGWV2Name-IP 的公共 IP 资源。
  • 对于 V1 SKU,需要身份验证证书才能设置与后端服务器的 TLS 连接。 V2 SKU 需要上传受信任的根证书,以实现相同的目的。 虽然 V1 允许使用自签名证书作为身份验证证书,但 V2 要求在后端使用自签名证书时生成并上传自签名根证书
  • 确保在迁移期间,V1 网关或任何关联的资源上没有规划其他操作。

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

重要

每次运行迁移脚本之前,运行 Set-AzContext -Subscription <V1 application gateway SubscriptionId> cmdlet。 这是将活动的 Azure 上下文设置为正确的订阅所必需的,因为迁移脚本可能会清理现有资源组(如果它在当前订阅上下文中不存在)。 对于版本 1.0.11 及以上的迁移脚本,这不是必需的步骤。

重要

迁移脚本的新稳定版本 1.0.11 现已推出,其中包含重要的 bug 修复和更新。使用此版本可避免潜在问题。

配置迁移

本文档提供了 Azure PowerShell 脚本。 该脚本执行以下操作来帮助你进行配置:

  • 在指定的虚拟网络子网中创建新的 Standard_V2 或 WAF_V2 网关。
  • 将与 V1 Standard 或 WAF 网关关联的配置无缝复制到新建的 Standard_V2 或 WAF_V2 网关。

下载脚本

可以从 PowerShell 库下载迁移脚本。迁移脚本的新稳定版本(版本 1.0.11)可用,其中包含重大更新和 bug 修复。 建议使用此稳定版本。

使用脚本

注意

每次运行迁移脚本之前,运行 Set-AzContext -Subscription <V1 application gateway SubscriptionId> cmdlet。 这是将活动的 Azure 上下文设置为正确的订阅所必需的,因为迁移脚本可能会清理现有资源组(如果它在当前订阅上下文中不存在)。 对于版本 1.0.11 及以上的迁移脚本,这不是必需的步骤。

根据本地 PowerShell 环境的设置和首选项,可以使用两个选项:

  • 如果你尚未安装 Azure Az 模块或者不介意卸载 Azure Az 模块,最佳做法是使用 Install-Script 选项运行该脚本。
  • 如果需要保留 Azure Az 模块,则最佳做法是下载并直接运行该脚本。

若要确定是否安装了 Azure Az 模块,请运行 Get-InstalledModule -Name az。 如果未看到任何已安装的 Az 模块,可以使用 Install-Script 方法。

只有尚未在计算机上安装 Azure Az 模块时才能使用此选项。 如果已安装,则以下命令将显示错误。 可以卸载 Azure Az 模块,或者另一个选项手动下载并运行该脚本。

使用以下命令运行该脚本以获取最新版本:

Install-Script -Name AzureAppGWMigration -Force

此命令还会安装所需的 Az 模块。

直接使用脚本安装

如果已安装某些 Azure Az 模块并且无法卸载它们(或者不想卸载),可以使用脚本下载链接中的“手动下载”选项卡手动下载该脚本。 此脚本将作为原始 nupkg 文件下载。 若要安装此 nupkg 文件中的脚本,请参阅手动下载包

版本 1.0.11 是包含重大 bug 修复的迁移脚本的新版本。 建议使用此稳定版本。

如何检查下载的脚本的版本

若要检查下载的脚本的版本,步骤如下:

  • 提取 NuGet 包的内容。
  • 打开文件夹中的 .PS1 文件,然后检查位于顶部的 ..VERSION,以确认下载的脚本的版本
<#PSScriptInfo
.VERSION 1.0.10
.GUID be3b84b4-e9c5-46fb-a050-699c68e16119
.AUTHOR Microsoft Corporation
.COMPANYNAME Microsoft Corporation
.COPYRIGHT Microsoft Corporation. All rights reserved.

如何运行脚本

若要运行该脚本,请执行以下操作:

  1. 使用 Connect-AzAccount -Environment AzureChinaCloud 连接到 Azure。

  2. 使用 Import-Module Az 导入 Az 模块。

  3. 运行 Set-AzContext cmdlet,将活动 Azure 上下文设置为正确的订阅。 这是一个重要的步骤,因为迁移脚本可能会清理现有资源组(如果它在当前订阅上下文中不存在)。

    Set-AzContext -Subscription '<V1 application gateway SubscriptionId>'
    
  4. 运行 Get-Help AzureAppGWMigration.ps1 检查所需的参数:

    AzureAppGWMigration.ps1
     -resourceId <V1 application gateway Resource ID>
     -subnetAddressRange <subnet space you want to use>
     -appgwName <string to use to append>
     -AppGWResourceGroupName <resource group name you want to use>
     -sslCertificates <comma-separated SSLCert objects as above>
     -trustedRootCertificates <comma-separated Trusted Root Cert objects as above>
     -privateIpAddress <private IP string>
     -publicIpResourceId <public IP name string>
     -validateMigration -enableAutoScale
    

注意

在迁移期间,请勿尝试对 V1 网关或任何关联的资源执行任何其他操作。

脚本的参数:

  • resourceId: [String]: 必需:此参数是现有的 Standard V1 或 WAF V1 网关的 Azure 资源 ID。 若要查找此字符串值,请导航到 Azure 门户,选择你的应用程序网关或 WAF 资源,然后单击网关对应的“属性”链接。 资源 ID 位于该页上。

    也可以运行以下 Azure PowerShell 命令获取资源 ID:

    $appgw = Get-AzApplicationGateway -Name <V1 gateway name> -ResourceGroupName <resource group Name>
    $appgw.Id
    
  • subnetAddressRange: [String]: 必需:此参数是为包含新 V2 网关的新子网分配(或想要分配)的 IP 地址空间。 必须使用 CIDR 表示法指定地址空间。 例如:10.0.0.0/24。 无需提前创建此子网,但 CIDR 需要是 VNET 地址空间的一部分。 此脚本将为你创建它(如果它不存在),如果存在,它会使用现有子网(确保子网为空,且仅包含 V2 网关(如果有),并且具有足够可用的 IP)。

  • appgwName: [String]:Optional。 这是指定用作新 Standard_V2 或 WAF_V2 网关的名称的字符串。 如果未提供此参数,则会使用现有 V1 网关的名称并在其后追加后缀 _V2

  • AppGWResourceGroupName: [String]: Optional。 要在其中创建 V2 应用程序网关资源的资源组的名称(默认值为 <V1-app-gw-rgname>

注意

确保 V1 订阅中没有具有提供的 AppGW V2 名称和资源组名称的现有应用程序网关。 这会重写现有资源。

  • sslCertificates: [PSApplicationGatewaySslCertificate]:Optional。 创建的 PSApplicationGatewaySslCertificate 对象的逗号分隔列表,这些对象表示 V1 网关中必须上传到新 V2 网关的 TLS/SSL 证书。 对于为 Standard V1 或 WAF V1 网关配置的每个 TLS/SSL 证书,可按如下所示通过 New-AzApplicationGatewaySslCertificate 命令创建新的 PSApplicationGatewaySslCertificate 对象。 需要 TLS/SSL 证书文件的路径和密码。

    仅当没有为 V1 网关或 WAF 配置 HTTPS 侦听器时,此参数才是可选项。 如果至少安装了一个 HTTPS 侦听器,则必须指定此参数。

    $password = ConvertTo-SecureString <cert-password> -AsPlainText -Force
    $mySslCert1 = New-AzApplicationGatewaySslCertificate -Name "Cert01" `
      -CertificateFile <Cert-File-Path-1> `
      -Password $password
    $mySslCert2 = New-AzApplicationGatewaySslCertificate -Name "Cert02" `
      -CertificateFile <Cert-File-Path-2> `
      -Password $password
    

    在以上示例中,可以传入 $mySslCert1, $mySslCert2(逗号分隔)作为脚本中此参数的值。

  • 来自 Keyvault 的 sslCertificates: 可选。 可以下载存储在 Azure Key Vault 中的证书,并将其传递给迁移脚本。 若要将证书下载为 PFX 文件,请运行以下命令。 这些命令访问 SecretId,并将内容另存为 PFX 文件。

     $vaultName = ConvertTo-SecureString <kv-name> -AsPlainText -Force
     $certificateName = ConvertTo-SecureString <cert-name> -AsPlainText -Force
     $password = ConvertTo-SecureString <password> -AsPlainText -Force
    
     $pfxSecret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $certificateName -AsPlainText
     $secretByte = [Convert]::FromBase64String($pfxSecret)
     $x509Cert = New-Object Security.Cryptography.X509Certificates.X509Certificate2
     $x509Cert.Import($secretByte, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
     $pfxFileByte = $x509Cert.Export([Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
    
     # Write to a file
     [IO.File]::WriteAllBytes("KeyVaultcertificate.pfx", $pfxFileByte)
    

    对于从 Keyvault 下载的每个证书,可以通过此处所示的 New-AzApplicationGatewaySslCertificate 命令创建新的 PSApplicationGatewaySslCertificate 对象。 需要 TLS/SSL 证书文件的路径和密码。

    //Convert the downloaded certificate to SSL object
    $password = ConvertTo-SecureString  <password> -AsPlainText -Force 
    $cert = New-AzApplicationGatewaySSLCertificate -Name <certname> -CertificateFile <Cert-File-Path-1> -Password $password 
    
  • trustedRootCertificates: [PSApplicationGatewayTrustedRootCertificate]:Optional。 创建的 PSApplicationGatewayTrustedRootCertificate 对象的逗号分隔列表,表示用于对 v2 网关中后端实例进行身份验证的受信任根证书

    $certFilePath = ".\rootCA.cer"
    $trustedCert = New-AzApplicationGatewayTrustedRootCertificate -Name "trustedCert1" -CertificateFile $certFilePath
    

    若要创建 PSApplicationGatewayTrustedRootCertificate 对象列表,请参阅 AzApplicationGatewayTrustedRootCertificate

  • privateIpAddress: [String]:Optional。 要关联到新 V2 网关的特定专用 IP 地址。 此地址必须来自为新 V2 网关分配的同一 VNet。 如果未指定,该脚本将为 V2 网关分配一个专用 IP 地址。

  • publicIpResourceId: [String]:Optional。 订阅中要分配给新 V2 网关的现有公共 IP 地址(标准 SKU)资源的 resourceId。 如果提供了公共 IP 资源名称,请确保它处于成功状态。 如果未指定参数,该脚本将在同一资源组中分配一个新的公共 IP 地址。 名称是追加了“-IP”的 V2 网关名称。 如果提供了 AppGWResourceGroupName 且未提供公共 IP 地址,请确保 V1 订阅中名为 AppGWResourceGroupName 的资源组中不存在名为 AppGWV2Name-IP 的公共 IP 资源。

  • validateMigration: [switch]:Optional。 在创建 V2 网关并复制配置后使用此参数让脚本执行一些基本的配置比较验证。 默认不会执行任何验证。

  • enableAutoScale: [switch]:Optional。 在创建新的 V2 网关后使用此参数让脚本对此网关启用自动缩放。 默认禁用自动缩放。 以后,始终可以在创建新的 V2 网关后手动启用自动缩放。

  1. 使用相应的参数运行脚本。 完成该脚本可能需要 5 到 7 分钟时间。

    示例

    AzureAppGWMigration.ps1 `
       -resourceId /subscriptions/aaaa0000-bb11-2222-33cc-444444dddddd/resourceGroups/MyResourceGroup/providers/Microsoft.Network/applicationGateways/myv1appgateway `
       -subnetAddressRange 10.0.0.0/24 `
       -appgwname "MynewV2gw" `
       -AppGWResourceGroupName "MyResourceGroup" `
       -sslCertificates $mySslCert1,$mySslCert2 `
       -trustedRootCertificates $trustedCert `
       -privateIpAddress "10.0.0.1" `
       -publicIpResourceId "/subscriptions/aaaa0000-bb11-2222-33cc-444444dddddd/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/MyPublicIP" `
       -validateMigration -enableAutoScale
    

注意事项/限制

  • 新的 V2 网关使用新的公共和专用 IP 地址。 无法将与现有 V1 网关关联的 IP 地址无缝移动到 V2。 但是,可将现有的(未分配的)公共或专用 IP 地址分配到新的 V2 网关。
  • 必须为 V1 网关所在的虚拟网络中的另一个子网提供 IP 地址空间。 该脚本无法在已有 V1 网关的子网中创建 V2 网关。 如果子网已具有 V2 网关,则脚本可能仍然会工作,前提是有足够的可用 IP 地址空间。
  • 如果你具有与 V2 网关子网关联的网络安全组或用户定义的路由,则为了成功迁移,请确保它们符合 NSG 要求UDR 要求
  • 应用程序网关子网中当前不支持虚拟网络服务终结点策略
  • 若要迁移 TLS/SSL 配置,必须指定 V1 网关中使用的所有 TLS/SSL 证书。
  • 如果为 V1 网关启用了 FIPS 模式,则它不会迁移到新的 V2 网关。 V2 不支持 FIPS 模式。
  • 如果你有仅限专用 IP 的 V1 网关,则脚本将为新的 V2 网关生成一个专用 IP 地址和一个公共 IP 地址。 仅限专用 IP 的 V2 网关目前为公共预览版。 正式发布后,客户可以利用脚本将其仅限专用 IP 的 V1 网关传输到仅限专用 IP 的 V2 网关。
  • 应用程序网关 V2 不支持 NTLM 和 Kerberos 身份验证。 此脚本无法检测网关是否正在为此类流量提供服务,并可能会在运行时造成从 V1 到 V2 网关的中断性变更。
  • WAFv2 是在旧 WAF 配置模式下创建的;需要迁移到 WAF 策略。

流量迁移

首先,请仔细检查脚本是否已成功创建了一个新的 V2 网关,其中包含要从 V1 网关迁移的确切配置。 可以从 Azure 门户验证此结果。

另外,请通过 V2 网关发送少量的流量作为手动测试。

在以下几种情况下,当前的应用程序网关 (Standard) 可以接收客户端流量,我们针对每种情况提供了建议:

  • 自定义 DNS 区域(例如 contoso.com)指向与 Standard V1 或 WAF V1 网关关联的前端 IP 地址(使用 A 记录)。

    可以更新 DNS 记录,使其指向与 Standard_V2 应用程序网关关联的前端 IP 或 DNS 标签。 根据 DNS 记录中配置的 TTL,可能需要一段时间才能将所有客户端流量迁移到新的 V2 网关。

  • 指向与 V1 网关关联的 DNS 标签(例如:使用 CNAME 记录指向 myappgw.chinanorth2.chinacloudapp.cn)的自定义 DNS 区域(例如 contoso.com)。

    有两种选择:

    • 如果在应用程序网关上使用公共 IP 地址,则可以使用流量管理器配置文件执行受控的粒度迁移,以增量方式将流量路由到新的 V2 网关(加权流量路由方法)。

      为此,可将 V1 和 V2 应用程序网关的 DNS 标签添加到流量管理器配置文件,并通过 CNAME 将自定义 DNS 记录(例如 www.contoso.com)指向流量管理器域(例如 contoso.trafficmanager.cn)。

    • 或者,可以更新自定义域的 DNS 记录,使其指向新 V2 应用程序网关的 DNS 标签。 根据 DNS 记录中配置的 TTL,可能需要一段时间才能将所有客户端流量迁移到新的 V2 网关。

  • 客户端连接到应用程序网关的前端 IP 地址

    更新客户端,以使用与新建的 V2 应用程序网关关联的 IP 地址。 我们建议不要直接使用 IP 地址。 请考虑使用与应用程序网关(可通过 CNAME 指向自己的自定义 DNS 区域(例如 contoso.com))关联的 DNS 名称标签(例如 yourgateway.chinanorth2.chinacloudapp.cn)。

定价注意事项

应用程序网关 V1 和 V2 SKU 的定价模型不同。 V2 根据使用量收费。 在迁移之前,请参阅应用程序网关定价以了解定价信息。

成本效益指南

V2 SKU 提供诸多优势,例如性能提升 5 倍、通过密钥保管库集成提高安全性、更快地更新 WAF_V2 中的安全规则、WAF 自定义规则、策略关联和机器人防护。 它还提供很高的可伸缩性、优化的流量路由,以及与 Azure 服务的无缝集成。 这些特性可以改进整体用户体验,防止在流量繁忙期间速度变慢,并避免代价高昂的数据违规。

V1 SKU 根据层和大小提供五种变体 - Standard_Small、Standard_Medium、Standard_Large、WAF_Medium 和 WAF_Large。

SKU V1 固定价格/月 V2 固定价格/月 建议
标准中型 102.2 179.8 V2 SKU 可以处理的请求数比 V1 网关更多,因此我们建议将多个 V1 网关合并成一个 V2 网关,以优化成本。 确保合并后不会超过应用程序网关的限制。 建议按照 3:1 的比例合并。
WAF 中型 183.96 262.8 与标准中型相同
标准大型 467.2 179.58 对于这些变体,在大多数情况下,迁移到 V2 网关所带来的成本效益比使用 V1 要好。
WAF 大型 654.08 262.8 与标准大型相同

注意

此处显示的计算基于美国东部区域,适用于 V1 中具有 2 个实例的网关。 V2 中的可变成本基于最常用的 3 个维度之一:新连接数(50 个/秒)、持久连接数(2500 个持久连接/分钟)、吞吐量(1 个 CU 可以处理 2.22 Mbps)。

此处所述的场景均为示例,仅用于演示目的。 若要了解你所在区域的定价,请参阅定价页

在定价方面若有其他疑问,请咨询 CSAM,或联系我们的支持团队以寻求帮助。

常见问题

此处可以找到有关迁移的常见问题

后续步骤

了解应用程序网关 V2