Application Gateway v1 is retired: a migration runbook for the stragglers
Application Gateway v1 retired on 28 April 2026 and Microsoft is now decommissioning the hardware and deleting unmigrated gateways. Here is a concrete runbook to find any v1 you still have, clone it to v2, cut traffic over, and fix the WAF on the way out.
You open a subscription you don’t touch often, run a quick inventory, and there it is: an Application Gateway still on the v1 SKU. The deadline to migrate was 28 April 2026 — it has already passed. If that’s you, don’t panic, but don’t sit on it either. Migration is still self-serve today, and that’s a much better place to be than waiting for the deletion notice. Here’s the runbook I’d work through.
What “retired” actually means now
Microsoft announced the v1 deprecation back on 28 April 2023 and retired the SKU exactly three years later, on 28 April 2026. Retired isn’t a soft state:
- There’s no SLA, no patches, and no support for v1 resources anymore.
- As Microsoft decommissions the underlying hardware (the “scream tests”), traffic through v1 gateways can no longer be guaranteed.
- Microsoft has said it will announce a deletion timeline, then block the data path and delete the v1 deployments that haven’t been migrated.
Two things to internalise before you start. First, Microsoft will not migrate your data for you — v1 is built on legacy components and every deployment is a little different, so this is on you. Second, for anything non-trivial, plan for the migration to take up to a couple of months. This is not a Friday-afternoon job.
Step 1 — Find every v1 gateway you still have
You can’t migrate what you haven’t inventoried, and v1 gateways love to hide in old
subscriptions. Azure Resource Graph answers this across your whole tenant in one query.
v1 gateways carry a SKU tier of Standard or WAF; v2 uses Standard_v2 / WAF_v2:
Resources
| where type =~ 'microsoft.network/applicationgateways'
| where properties.sku.tier in~ ('Standard', 'WAF') // v1 tiers only
| project name, resourceGroup, subscriptionId, location,
tier = tostring(properties.sku.tier),
sku = tostring(properties.sku.name)
| order by subscriptionId asc
Run it in Resource Graph Explorer in the portal or with az graph query -q "<query>".
Anything that comes back is a migration item.
Step 2 — Understand the two stages
Migration has two distinct stages, and the tooling only covers the first one:
- Configuration migration — clone the v1 settings onto a brand-new v2 gateway.
- Traffic migration — cut your clients over to that v2 gateway.
The PowerShell scripts Microsoft ships only migrate the configuration. Moving live traffic is a separate, deliberate step that you own. Keep the two stages clearly apart in your change plan.
Step 3 — Clone the configuration
Microsoft publishes the cloning scripts on the PowerShell Gallery. The enhanced cloning
script (AzureAppGWClone) is the recommended one — it copies your TLS/SSL and trusted
root certificates automatically, supports private-only v2 gateways, and can build a WAF
policy for you in the same pass.
# From Azure Cloud Shell, or a local session with the Az modules.
# Run Set-AzContext FIRST, every single time — if the script runs against the wrong
# subscription context it can clean up the existing resource group.
Set-AzContext -Subscription '<v1-subscription-id>'
Install-Script -Name AzureAppGWClone -Force
./AzureAppGWClone.ps1 `
-resourceId '/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.Network/applicationGateways/<v1-name>' `
-subnetAddressRange '10.0.1.0/24' ` # a NEW subnet — v1 and v2 can't share one
-appgwName 'appgw-prod-v2' `
-wafpolicyname 'waf-prod-policy' # builds a WAF policy from the v1 WAF config
A few things worth knowing:
- The script takes roughly five to seven minutes.
- v1 and v2 cannot live in the same subnet, so you must hand it a new address range (CIDR) in the same virtual network with enough free IPs.
- It creates the v2 gateway with a size appropriate to your v1 traffic. Set autoscale
explicitly and verify it afterwards rather than assuming a default — the enhanced
script exposes
-DisableAutoscale, the legacyAzureAppGWMigrationscript defaults autoscale off and takes-enableAutoScale.
When it finishes, test the v2 gateway directly — send a little traffic to its own IP and confirm the data path works — before you touch anything customer-facing.
Step 4 — Cut the traffic over
Two common approaches, depending on how much downtime you can absorb.
Public IP retention (AzureAppGWIPMigrate) reserves the public IP from v1, converts
it from Basic to Standard, and attaches it to v2 — so clients hitting that IP just land on
v2:
Install-Script -Name AzureAppGWIPMigrate -Force
./AzureAppGWIPMigrate.ps1 `
-v1resourceId '<v1-resource-id>' `
-v2resourceId '<v2-resource-id>'
This is the quick path, with a brief ~1–5 minute downtime. Caveats: v1 and v2 must be
in the same subscription, the swap is irreversible, and the script won’t touch a
public IP whose DNS name starts with a digit (common on v1 gateways created before May
2023, which got an auto-assigned {GUID}.cloudapp.net label) — rename the label first.
If you’d rather bleed traffic over gradually, keep both gateways running and use DNS — repoint your A record, or put both behind an Azure Traffic Manager profile with weighted routing and shift the weights over time. Slower, but fully controlled and reversible.
Step 5 — Don’t stop at v2: fix the WAF
If you were running WAF v1, migrating to v2 is only half the job. v1 has no concept of a WAF policy, so a freshly migrated gateway lands on legacy WAF configuration — and that mode is itself on the way out. Microsoft announced its deprecation in 2024, blocked new WAF-configuration deployments on 15 March 2025, and retires it entirely on 15 March 2027. Migrating onto a dead-end config helps nobody.
So go straight to a WAF policy. Either pass -wafpolicyname to the clone script in
Step 3, or upgrade an existing legacy configuration afterwards — in the portal it’s Web
Application Firewall → Upgrade from WAF configuration, and it’s a no-downtime
operation (also available via Firewall Manager or PowerShell). While you’re there, note
that the migrated WAF v2 defaults to CRS 3.0, which is on the deprecation path — move
to the latest DRS rule set once you’re stable.
The gotchas the script won’t fix for you
- Diagnostic settings aren’t replicated. If your v1 gateway shipped logs to a Storage account or Log Analytics, the clone does not carry that over — re-add it on v2.
- Backend TLS got stricter. v2 validates the full certificate chain and subject name by default, where v1 did an exact-match on an authentication certificate. The enhanced script relaxes that validation during the clone so you don’t break on day one — treat that as temporary and re-enable full validation for production.
- FIPS mode is not migrated.
- NSG/UDR on the new subnet must meet Application Gateway’s requirements, or the deployment fails.
- New IPs by default — unless you use the IP-retention script or attach an existing unallocated IP, v2 comes up with fresh public and private addresses.
The takeaway
The deadline has passed, but the door hasn’t closed: migration is still self-serve, and the scripts do most of the heavy lifting. The risk isn’t the migration — it’s the deletion notice arriving before you’ve started. Inventory your v1 gateways this week, clone the busiest one into a v2 with a real WAF policy, and rehearse the IP cutover in a maintenance window. Future-you, reading the “your gateway will be deleted” email, will be glad it’s already a non-event.
Sources & further reading: Migrate from Application Gateway V1 to V2 by April 28, 2026, FAQ about Application Gateway V1 retirement, Migrate Application Gateway and WAF from V1 to V2, Upgrade to Azure Application Gateway WAF policy.