Skip to main content

One Script, Five Hours, Three Dead Layers: What Azure's West US Outage Reveals About the Shared Fate Inside Every Managed Region

9 min readDora NodaDora Noda
Share
On this page

At 07:44 on the morning of July 23, 2026, an Azure engineer kicked off routine device maintenance in the West US region. By lunchtime, half the services in California were unreachable — not because a datacenter lost power or a fiber cable was cut, but because a bug in a maintenance-automation tool deleted network routes from more machines than it was supposed to. Five hours later, at 19:41 UTC, everything was back. Nothing had been hacked. No hardware had failed. One script had simply been too enthusiastic about cleaning up routes, and an entire region's front door slammed shut.

That is the story worth sitting with. Not "cloud goes down again," but how it went down: a single automation bug whose blast radius spanned the managed Kubernetes control plane, the managed database, and the ingress layer simultaneously. If you run your apps on a managed cloud, those three things feel like independent services with independent SLAs. For five hours in West US, they were one failure domain wearing three costumes.

The five hours, minute by minute

Microsoft's preliminary post-incident review gives an unusually precise timeline, and the precision matters — it shows how long each stage of detection, diagnosis, and rollback actually takes when the network itself is what's broken:

  • 14:44 UTC — Routine device maintenance begins in West US. A maintenance-request conversion tool removes IP routes from more devices than intended while isolating a device. Large-scale route churn starts in Microsoft's wide-area network.
  • ~16:00–17:45 UTC — Engineers correlate the routing behavior with recent fiber maintenance activity. Note the gap: over an hour passes between "something is very wrong" and "we know which change did it." When the WAN is churning, your telemetry about the WAN is itself degraded.
  • 17:45 UTC — Rollback of the offending changes begins.
  • 18:26 UTC — The WAN is restored and healthy.
  • 19:41 UTC — All impacted services fully recovered. Total customer-facing impact: just under five hours.

The detail that separates this outage from a datacenter fire is the one Microsoft states plainly and most coverage skips: traffic that stayed entirely inside the West US region was not affected. Your pods could still talk to each other. What failed was traffic entering or exiting the region. The region didn't die — it was quarantined.

What broke, layer by layer

The preliminary review's affected-services list is long enough to be worth grouping, because the grouping is the point. Every layer of a typical cloud-native stack fell over at once:

Compute and orchestration

  • Azure Kubernetes Service (AKS)
  • Azure Virtual Desktop, Azure VMware Solution, Azure Databricks
  • App Service

Data

  • Azure Database for PostgreSQL
  • Azure Cosmos DB
  • Azure Data Explorer, Azure AI Search

Ingress and networking

  • Application Gateway
  • Azure Firewall, VPN Gateway, ExpressRoute circuits and gateways, Virtual WAN
  • Azure API Management, Azure Front Door–adjacent edge paths

Identity and observability

  • Microsoft Graph, Azure AD B2C
  • Azure Monitor, Application Insights, Microsoft Sentinel
  • Azure Bastion (so the usual break-glass remote access was degraded too)

Read that list the way an operator would: the thing that runs your code (AKS, App Service), the thing that holds your data (Postgres, Cosmos DB), the thing that routes your users to your code (Application Gateway, API Management), and the thing that tells you what's happening (Monitor, Insights) all went dark or degraded together. Your runbook probably assumes at most one of those fails at a time.

The quarantine detail changes the lesson

Most "cloud outage" postmortems end at "single region, single point of failure, go multi-region." This one deserves a sharper reading, because the failure was at the region's edge, not in its interior. The services were fine. The routes into and out of the region were gone.

That distinction matters for two reasons. First, it defeats the most common cheap mitigation: zone redundancy. Spreading your AKS node pools across availability zones protects against a zonal failure — a rack, a building, a power feed. It does nothing when the region's WAN routes evaporate, because every zone in the region leaves through the same front door. Microsoft's own reliability guidance treats zone redundancy as the baseline step and multi-region failover as the separate, optional, expensive next step. This outage is the case study for why they're separate steps.

Second, it explains why recovery took five hours despite a rollback starting at 17:45. Restoring routes across a churned WAN is not flipping a switch; the network has to re-converge, and then every dependent service has to re-establish its own health on top of it. The WAN was healthy at 18:26, but full service recovery took another 75 minutes. Dependencies recover serially even when they failed in parallel.

Why one bug had that much reach

Here is the uncomfortable architecture underneath the incident: on a hyperscaler, your compute, your managed database, and your ingress all sit inside the same vendor's regional network fabric, operated by the same vendor's automation. That sharing is the product — it's why provisioning an AKS cluster with a managed Postgres and an Application Gateway takes minutes instead of quarters. But it means a single vendor maintenance script is, in effect, a shared dependency of all three, and no per-service SLA accounts for it.

The bug itself is almost banal, which is what makes it scary. The maintenance-request conversion software — the tool that translates "isolate this device for maintenance" into actual device-level changes — applied route removals to more devices than intended. There was no adversary, no exotic interaction, no cascade across services. One tool with region-wide write access to the network did slightly more than asked, and the blast radius was everything that needs the network to reach the region. Which is everything.

This is the exact failure mode that redundancy within the vendor can't fix. A second AKS cluster in the same region fails the same way. A read replica of your Postgres in the same region fails the same way. The only in-vendor answer is a second region with independent networking — active/passive behind Azure Front Door, geo-replicated databases, cross-region traffic — and Microsoft's own documentation prices that honestly: roughly double the compute, doubled database cost for geo-replication, plus Front Door at around $35/month base before traffic. For a small team, "survive a regional WAN incident" costs about 2x the infrastructure bill. Most teams rationally decline that trade, pocket the savings, and accept the five-hour risk. That's a legitimate choice — as long as it's a conscious one, made with the blast radius in view.

What this looks like from owned hardware

Now the self-hosting contrast, stated without romance. A Cluster API fleet on dedicated machines — say, Hetzner boxes you provision and reconcile yourself — does not have this exact failure mode, for a structural reason: there is no single vendor automation with write access to your compute, your routing, and your database at the same time. Your nodes come from a server provider, your transit comes from upstream networks, your database is software you operate (or a separate managed service with its own network path). A bad day at your server provider doesn't delete your routes, because your server provider doesn't own your routes.

That decoupling is real, and it's the strongest version of the self-hosting reliability argument — not "our hardware fails less" (it doesn't), but "our failures are uncorrelated by default." When something breaks, one layer breaks, and the other layers are still there to help you fix it. Your monitoring still works during a compute outage. Your bastion still answers during a network flap. Contrast July 23: Bastion, Monitor, and Sentinel were on the casualty list alongside the things they were supposed to help you debug.

But honesty requires the other half. What you buy with decoupling is paid for in operations you now own: etcd backups, Kubernetes upgrades, node health checks, database replication, and failover logic that a managed control plane does for you. Hetzner gives you datacenters, not availability zones with single-millisecond latency between them, so your "multi-failure-domain" story is genuinely weaker at the physical layer than a hyperscaler's. And your own automation can absolutely have the same class of bug — a bad Ansible run or a misapplied network policy can quarantine your fleet just as thoroughly. The difference is scope of authorship: your automation bug affects your fleet, not every tenant in the region, and you can read every line of the tool that did it.

So the honest comparison is not "managed fails, self-hosted doesn't." It's about which correlated failures you accept and who gets to cause them. Managed single-region accepts rare, region-wide, vendor-authored correlation in exchange for near-zero operational burden. Self-hosted on owned hardware accepts frequent, small, self-authored failures in exchange for failures that stay in their lane. Multi-region managed accepts neither failure mode and charges you ~2x for the privilege.

A checklist worth stealing from this incident

Whatever you run on, July 23 suggests four concrete questions:

  1. Can you reach your break-glass tooling when the network fails? Bastion and Monitor were both degraded. If your only path into the fleet depends on the same fabric as the fleet, you don't have break-glass access — you have a second glass door next to the first one.
  2. Does your runbook survive all three layers failing at once? Most incident playbooks sequence neatly: app down → check database → check ingress. When all three are down, sequencing is useless; you need the one line that says "check the vendor status page first."
  3. Have you priced multi-region, or just assumed it? Get the actual number — duplicated compute, geo-replicated database tier, cross-region egress — and decide explicitly. "Too expensive, accepted risk" is a strategy. "We'll worry about it later" is not.
  4. Do you know what your vendor's automation can touch? The blast radius of a cloud is defined less by its architecture diagrams than by the write scope of its internal tooling. You can't audit Microsoft's maintenance scripts. You can know that they exist, that they span the region, and that your zones don't bound them.

Five hours, no data loss reported, full recovery the same day — by the standards of infrastructure incidents, this one ended well. Its value is diagnostic: it showed, in production, with a published timeline, exactly where the shared fate in a managed region lives. Not in the services. In the routes between you and them.

Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex