AWS Cloud WAN series · Part 12 of 17

Migrating Off Transit Gateway, Part 2 — The Cutover

Twelfth in the AWS Cloud WAN series, and the sequel to Part 1 on federation. Federation gave you global routing while every workload stayed on its old Transit Gateway. Phase 2 finishes the job: VPCs attach straight to the core network, Direct Connect moves to a native gateway, and the TGWs come down — all of it reversible, one workload at a time, with no flag day.

TL;DR

The cutover is safe because the control point is small and reversible: for each VPC, the thing that actually moves live traffic is one route in that VPC's own route table, flipped atomically with the EC2 ReplaceRoute API. Build the Cloud WAN attachment alongside the existing TGW one, validate it carries no traffic, then flip — and if anything breaks, flip back. Do it per-VPC in waves (non-prod, then prod), move Direct Connect last and in a maintenance window, and decommission the now-idle TGWs only after a stabilization period. The reward is the single-hop path VPC → Cloud WAN → VPC instead of federation's VPC → TGW → Cloud WAN → TGW → VPC.

Do it this way

  • Build the new path in parallel; flip exactly one control (a route, or a BGP preference) to cut over.
  • Use ReplaceRoute (atomic) over delete-then-add, so there's no gap where the VPC has no route.
  • Migrate per-VPC, in waves — non-prod first, validate, then prod.
  • Move Direct Connect last, in a maintenance window; decommission TGWs after a stabilization period.

Don't do this

  • Don't cut a whole region at once — keep the blast radius to one workload.
  • Don't delete then add the live route — that's a downtime window.
  • Don't rush the teardown — an idle TGW costs little and preserves an easy rollback.
  • Don't assume Cloud WAN is cheaper outright — the per-region CNE base and per-attachment fee are real.

Why finish what federation started — killing the double-TGW hop

Part 1 left you in a working but compromised state. Federation peers each TGW to its same-region Core Network Edge and maps each TGW route table to a Cloud WAN segment, so routing is global and dynamic — but every VPC is still attached to its original TGW. A flow between two VPCs in the same segment takes the scenic route: VPC → TGW → Cloud WAN → TGW → VPC. That's two TGW hops bracketing the core.

Plenty of teams stop there, and that's a legitimate place to stop. But if the reason you started was to retire TGW route-table sprawl and simplify the path, Phase 2 is where you collect. It removes the intermediary so a VPC attaches directly to the Core Network Edge, and the same flow becomes VPC → Cloud WAN → VPC — one hop, no TGW in the data path (Figure 1).

The cost picture improves too, but be precise about why. The CNE-to-TGW peering hop itself is free — AWS charges no data processing on traffic between a Core Network Edge and a peered TGW. The savings come from the attachments: in federation, a VPC-to-VPC flow is data-processed at each TGW it transits, so it pays at two TGW domains plus the Cloud WAN side. After Phase 2, that collapses to a single Cloud WAN data-processing event. It's a real reduction — just don't sell it as "the peering hop was double-charged," because it wasn't.

Figure 1 · A VPC mid-cutover Region · us-east-1App VPCPrivate subnetTGW attachmentCW attachmentfederation peeringWorkloadEC2Transit Gatewayold path · drainingCloud WAN CNEnew path · live
The cutover is never a leap: the Cloud WAN attachment is live and validated before the old TGW attachment is removed, so there is always a working path.

How you move one VPC without a flag day — the reversible cutover loop

The whole of Phase 2's VPC work is one small loop, repeated per VPC. Done carefully it is per-VPC and reversible, so the blast radius of any mistake is a single workload, not the estate. The loop (Figure 2):

  1. Prepare. Create the Cloud WAN VPC attachment alongside the existing TGW attachment. Put its ENIs in dedicated subnets — mind the AZ-ID consistency point from Article 5, since AZ names map to different physical zones across accounts — and tag the attachment (not the VPC resource) so your attachment policy maps it to the right segment, the rule Article 4 leans on. For a sensitive segment with require-attachment-acceptance on, accept it deliberately.
  2. Validate. Confirm the attachment reaches Available (one of the eight attachment lifecycle states) and that the segment has learned the VPC's routes — all without sending it any production traffic yet.
  3. Shift. Repoint the route in the VPC's own route table from the TGW to the Cloud WAN core network. This is the one step that moves live traffic, and it's the subject of the next section.
  4. Verify. Check reachability and that segmentation still holds — the VPC reaches what it should and nothing it shouldn't.
  5. Drain & commit. Watch the old TGW path empty, then delete that VPC's TGW attachment. Now it's on Cloud WAN alone.

Because the VPC route table is the control point, rollback for any VPC is just repointing its route back at the TGW — the same atomic operation in reverse. That property is what lets you migrate non-production first, validate a whole wave, then take production in its own waves with confidence, instead of betting the estate on one change window.

Figure 2 · The per-VPC cutover loop One loop, repeated per VPC — only step 3 moves live traffic forward rollback 1 Prepare create the CW attachment 2 Validate Available, routes learned, no traffic 3 Shift ReplaceRoute to the core network 4 Verify reachability + segmentation 5 Commit drain, delete TGW attach if it breaks: ReplaceRoute the VPC route back to the TGW (per VPC)
Every step before the shift is non-disruptive setup; the shift and its rollback are the same atomic route change, in opposite directions.

The trick that makes the shift safe — longest-prefix in the VPC route table

Cloud WAN follows Transit Gateway route-evaluation semantics, and the one rule that matters here is longest-prefix match wins, absolutely — the most specific route to a destination is chosen regardless of how it was learned. That gives you a finer instrument than flipping a whole route at once.

The blunt version of step 3 is to ReplaceRoute the existing route — say 10.0.0.0/8 → TGW becomes 10.0.0.0/8 → core network — in one atomic call. AWS specifically recommends ReplaceRoute over a console delete-then-add precisely because delete-then-add leaves a window with no route at all; ReplaceRoute swaps the target in place with no gap.

The surgical version uses longest-prefix to bleed traffic across one destination at a time (Figure 3). Leave the broad 10.0.0.0/8 → TGW in place as a fallback and add a more-specific route — 10.10.0.0/16 → core network — for just the prefix you want to move. Longest-prefix match sends anything inside 10.10.0.0/16 over Cloud WAN while everything else in 10/8 still rides the TGW. Validate that slice, add the next more-specific prefix, and so on. Rollback is deleting the more-specific route: traffic falls straight back to the /8 via the TGW. The broad fallback never changes until you're done.

Figure 3 · Longest-prefix steers the shift VPC route table · during cutover Destination Target 10.0.0.0/8 Transit Gateway · fallback 10.10.0.0/16 Cloud WAN core · more specific, wins stays added packet to 10.10.5.4 matches /16 (longest prefix) → Cloud WAN packet to 10.20.7.1 only matches /8 (fallback) → Transit Gateway Add /16s one at a time to drain a destination; delete the /16 to roll back — instantly. The /8 never moves until you’re done.
A more-specific prefix on Cloud WAN drains one destination at a time while the broad route holds the rest on the TGW; deleting it is the rollback.

Moving hybrid connectivity — Direct Connect from TGW to native DXGW

If your hybrid connectivity terminates Direct Connect on a TGW, Phase 2 is also when you move it to a native Direct Connect Gateway attachment — a DXGW that attaches straight to the core network with no intermediary TGW, learning and advertising on-prem routes over BGP automatically (Article 6 covers the native model in depth). This is the highest-risk part of the whole migration, because on-premises reachability rides on it, so it gets the most ceremony. The same parallel-then-flip discipline applies, just with BGP as the control instead of a route table:

  1. Build the new path in parallel. Create new DXGWs and new transit VIFs and associate them with the core network's segment. The DXGW object is free to create, so standing up parallel gateways costs nothing and gives you a clean rollback — but note the DXGW attachment to Cloud WAN is billable once it's carrying traffic, so don't budget the hybrid path as free. A native DXGW associates with a single core network and a single segment (multiple DXGWs can share one segment), and its ASN must sit outside the core's ASN range.
  2. Verify before advertising. Confirm the new BGP peers are up but not yet advertising on-prem prefixes — the path is wired and idle.
  3. Flip the preference. Advertise the same on-prem prefixes on the new VIFs, then make your on-premises routers prefer the new VIFs (typically via BGP local preference). This single step is the only one that changes live routing — do it in a scheduled maintenance window.
  4. Roll back if needed by withdrawing the new advertisements and reverting on-prem preference to the old VIFs.

The shape is identical to the VPC loop: everything up to the preference change is non-disruptive preparation, and only the flip touches existing flows. AWS still recommends a TGW per Region for Direct Connect in some designs, so keep workloads reaching the DXGW directly within their Region rather than creating cross-Region dependencies during the move. When the native path proves out, the TGW is left doing nothing but terminating DX during the transition — which is exactly what you retire next.

Retiring the Transit Gateways — the easy part, done last

Once VPCs are on Cloud WAN attachments and DX is on a native DXGW, the remaining TGWs carry no traffic. Decommissioning is pure cleanup, with no further traffic changes:

Do this last, deliberately, and only after a stabilization period on the new paths. There's no rush: an idle TGW costs little, and keeping it around a while longer preserves the easiest possible rollback if something surfaces a week later.

Sequencing the whole cutover — parallel build, then one flip

Stacked end to end, a sane Phase 2 reads as five stages on top of the federated network (Figure 4): migrate non-production VPCs in waves, then production VPCs in waves and maintenance windows, then Direct Connect to native DXGW in a window, then stabilize, then decommission. At every stage the new path is built and validated alongside the old, and the cutover is a single deliberate change — a route flip or a BGP preference — with rollback available throughout.

One operational caution worth repeating from Article 13: don't try to create the Cloud WAN core network and its VPC attachments in the same infrastructure-as-code workspace. AWS's own guidance is to decouple the global network and core network from the regional VPCs into separate stacks for independent lifecycle management, and that separation matters most during migration, when you're creating many attachments against an already-live core network.

Figure 4 · The Phase 2 sequence Five stages on the federated network — reversible until the last 1 · Non-prod VPCs, in waves 2 · Prod VPCs waves + windows 3 · Direct Connect native DXGW 4 · Stabilize run on new paths 5 · Decommission delete TGWs build the new path in parallel → validate → flip one control reversible: a route, or a BGP preference irreversible cleanup · do last
The same parallel-then-flip move repeats across non-prod, prod, and DX; only the final teardown is one-way, which is why it waits for stabilization.

What you actually bought — and what you didn't

When the TGWs are gone, take the honest accounting from Article 1. You gained one versioned policy instead of a hundred per-region route tables, tag-based segmentation that auto-onboards new workloads, native global dynamic routing, and the single-hop path that quietly improves the inter-region cost picture. You did not gain fewer firewalls, a replacement for SD-WAN or MPLS, or a different regional data-plane resilience story — Cloud WAN inherits the Core Network Edge's TGW-like properties, not a new failure model.

And it isn't automatically cheaper. A named practitioner estimate puts Cloud WAN at roughly a 30% premium over an equivalent TGW design — illustrative and region-dependent, not an AWS figure — driven by the per-region CNE base of about $365/month that TGW has no equivalent for, plus a higher per-attachment fee. What Phase 2 buys is operational simplicity and global routing. If your team was drowning in TGW route-table tickets, that's the win that justified the project; if it wasn't, federation alone may have been the right place to stop.

The migration cluster assumed you'd build all of this somehow, and for any real network "somehow" means infrastructure as code. The next cluster turns to operations and engineering: Article 13 covers managing the core network policy as code with Terraform — the aws_networkmanager_core_network_policy_document data source versus raw JSON, dynamic blocks for scaling segments and regions, the dummy-base-policy bootstrap, and the AWS-maintained modules and blueprints that give you a tested starting point.

Sources

  1. AWS — AWS Cloud WAN and AWS Transit Gateway migration and interoperability patterns (blog): per-VPC reversible cutover, repointing the VPC route table as the control point, the EC2 ReplaceRoute API (atomic) over delete-then-add, migrating in waves. aws.amazon.com/blogs/.../aws-cloud-wan-and-aws-transit-gateway-migration-and-interoperability-patterns
  2. AWS — Cloud WAN peerings: a TGW route-table (peering) attachment peers a CNE with a same-Region TGW and extends one TGW route table to one segment; dynamic BGP only. docs.aws.amazon.com/.../cloudwan-peerings.html
  3. AWS — How transit gateways work: route evaluation — longest-prefix match wins absolutely, static beats propagated; Cloud WAN follows the same semantics. docs.aws.amazon.com/.../how-transit-gateways-work.html
  4. AWS — Create a Cloud WAN attachment: the eight attachment lifecycle states (Creating, Deleting, Pending network update, Pending tag acceptance, Pending attachment acceptance, Rejected, Available, Failed). docs.aws.amazon.com/.../cloudwan-create-attachment.html
  5. AWS — Direct Connect gateway attachments in Cloud WAN: native DXGW attaches directly to the core network with no intermediary TGW; single core network and single segment per DXGW (multiple DXGWs per segment allowed); DXGW ASN outside the core range; no static routes. docs.aws.amazon.com/.../cloudwan-dxattach-about.html
  6. AWS — Deploying hybrid networks using AWS Cloud WAN and AWS Direct Connect (blog): the recommendation to keep a Transit Gateway per Region for DX in some designs so each Region reaches the DXGW directly. aws.amazon.com/blogs/.../deploying-hybrid-networks-using-aws-cloud-wan-and-aws-direct-connect
  7. AWS — Simplify global hybrid connectivity with AWS Cloud WAN and AWS Direct Connect integration (blog): low-downtime DX cutover — new DXGWs and VIFs in parallel, verify BGP peers before advertising, flip on-prem local preference, roll back by reverting preference. aws.amazon.com/blogs/.../simplify-global-hybrid-connectivity-with-aws-cloud-wan-and-aws-direct-connect-integration
  8. AWS — Cloud WAN pricing: the CNE-to-TGW peering hop carries no data-processing charge; the DXGW object is free but its Cloud WAN attachment is billable; CNE $0.50/hr (~$365/mo), VPC attachment $0.065/hr (us-east-1), data processing $0.02/GB. aws.amazon.com/cloud-wan/pricing
  9. AWS — What is AWS Cloud WAN: a global network can contain both TGWs and Cloud WAN core networks (coexistence); a CNE "is also known as an AWS Transit Gateway, and it inherits many of the same properties." docs.aws.amazon.com/.../what-is-cloudwan.html
  10. AWS — Cloud WAN core network configuration: a Region can't be removed from the policy until its associated attachments are deleted. docs.aws.amazon.com/.../cloudwan-core-network-config.html
  11. AWS — terraform-aws-cloudwan module (README): decouple the global network and core network from the regional Central VPCs into separate stacks/workspaces for independent lifecycle management. github.com/aws-ia/terraform-aws-cloudwan
  12. Alexandre Agius (AWS Solutions Architect) — Cloud WAN vs Transit Gateway, an honest assessment (blog): a practitioner's illustrative, region-dependent ~30% premium estimate, driven by the per-region CNE base and a higher per-attachment fee. Not an AWS-published figure. agiusalexandre.com/blog/2026-04-09-cloud-wan-vs-transit-gateway-honest-assessment
  13. AWS — Core network policies (JSON) reference: require-attachment-acceptance defaults to true, so an attachment to a sensitive segment sits pending until it's accepted. docs.aws.amazon.com/.../cloudwan-policies-json.html
  14. AWS — Attachment policies for the core network: the attachment's own tags are analyzed by the attachment policy, not the tags on the underlying VPC resource. docs.aws.amazon.com/.../cloudwan-policy-attachments.html