The December 2021 us-east-1 event began with internal network congestion that impaired the region's control plane, and customers found they could not even read the service health dashboard. What are the three durable architectural lessons, independent of the specific bug?
Show the full answer Hide the answer
What happened, at the level that generalises
Automated scaling activity triggered congestion on an internal network connecting a large fleet to the main network. The congestion caused latency and errors on internal communication, which impaired the control plane services — the APIs that create, modify and describe resources. Recovery was prolonged because the tooling used to diagnose and remediate depended on the same impaired substrate, and because restoring the fleet risked recreating the congestion.
Customers observed that existing resources largely kept working, while any operation that required the control plane — launching an instance, changing a load balancer target, failing over — did not. Even the status dashboard was affected, because its publication path ran in the affected region.
Lesson one: the control plane and the data plane fail separately, and you must know which you depend on
The data plane serves your traffic. The control plane changes your configuration. They have completely different reliability characteristics: data planes are engineered to be simple and static, control planes are complex, stateful and comparatively fragile.
A recovery plan that requires control-plane operations will fail during exactly the events that trigger it. "We will fail over by updating DNS / scaling up the standby / changing the load balancer" is a plan that assumes the control plane works, and it frequently does not.
Lesson two: static stability
A system is statically stable if it continues to operate correctly with its current configuration and needs no control-plane action to survive a failure. Concretely:
- Pre-provision standby capacity rather than planning to scale into a failure. Running the standby region at full size costs money and is the only version that works when scaling APIs are unavailable.
- Health-check-based failover that is already configured, rather than a failover that must be enacted.
- Cached configuration with long stale-serving windows, so a service that cannot reach the configuration system keeps running on the last-known-good values rather than failing.
- No dependency on describe/list APIs in the request path — a startlingly common hidden coupling.
Lesson three: your status and communications must not share the failure domain
If the mechanism that tells customers what is happening lives in the affected region, the outage is accompanied by silence, which converts a technical incident into a trust incident. The same applies internally: the incident channel, the runbooks, the credentials vault and the deployment tooling all need examining for whether they survive the loss of the region they describe.
The uncomfortable practical point
us-east-1 hosts global control planes for several services, so "we do not deploy in us-east-1" is not by itself sufficient isolation. The dependency must be verified rather than assumed — and the verification is the work most organisations skip.