将 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。 使用此迁移指南帮助你规划和执行迁移。
迁移分为两个阶段:
- 迁移配置
- 迁移客户端流量
本文主要帮助你完成配置迁移。 客户端流量迁移过程因环境而异。 本文提供了一些常规建议。
先决条件
- 具有活动订阅的 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
方法。
使用 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.
- 请确保使用 PowerShell 库中的最新稳定版本
如何运行脚本
若要运行该脚本,请执行以下操作:
使用
Connect-AzAccount -Environment AzureChinaCloud
连接到 Azure。使用
Import-Module Az
导入 Az 模块。运行
Set-AzContext
cmdlet,将活动 Azure 上下文设置为正确的订阅。 这是一个重要的步骤,因为迁移脚本可能会清理现有资源组(如果它在当前订阅上下文中不存在)。Set-AzContext -Subscription '<V1 application gateway SubscriptionId>'
运行
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 网关后手动启用自动缩放。
使用相应的参数运行脚本。 完成该脚本可能需要 5 到 7 分钟时间。
示例
AzureAppGWMigration.ps1 ` -resourceId /subscriptions/8b1d0fea-8d57-4975-adfb-308f1f4d12aa/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/8b1d0fea-8d57-4975-adfb-308f1f4d12aa/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,或联系我们的支持团队以寻求帮助。
常见问题
在此处可以找到有关迁移的常见问题