The situation
All our AWS networks were interconnected through a transit-gateway setup built from about 15 copies of a community module. Routes were tracked by their position in a list, so adding one network range made the plan propose destroying and recreating production routes. That blast radius kept the stack effectively frozen for years.
The constraint was the route model, not the team. With a transit gateway all the wiring is yours: a route table per attachment, hand-managed propagation, and no concept of “environment” beyond the discipline of whoever edits the routes.
What I did
Two moves: first make it safe, then make it better.
Make it safe
I replaced the module copies with plain, explicit resources where every route has a stable identity. Changing one range now touches exactly one route.
Make it better
The second move was AWS Cloud WAN, the managed successor to the transit gateway. I wrote the proposal and the team adopted it; we also evaluated AWS’s Network Orchestration for Transit Gateway solution and rejected it as too many moving parts to own.
The network is one reviewable document. Segments (production, non-production, shared, and a quarantine for anything unrecognized) and the rules for joining them live in a single policy definition, in git, instead of being implied by dozens of route tables.
Joining is by policy, not by hand. An attachment is admitted to a segment only if it carries the right tag and comes from the right account; anything unknown lands in quarantine with no connectivity. Nobody edits another account’s route tables any more.
Real separation. Production and non-production traffic cannot mix unless the policy says so, a property the transit-gateway mesh never had.
Managed and multi-region. AWS runs the core network with an edge in each region we need, so expanding to a new region is a policy change rather than a peering project.
Proving the migration was a no-op
The migration to the new code had to move live production routing with no infrastructure change applied. I generated an explicit state map from every old resource to its new address, opened a deliberately unmergeable demonstration pull request to prove the plan was a no-op, wrote a rollback runbook, landed the real change, and deleted the scaffolding.
What it changed
Network changes are reviewable at resource and policy level, dependency updates and colleague-authored changes use the same plan-and-review path as the rest of the estate, production and non-production have explicit separation, and a new environment joins the network programmatically.