Engineering Atlas › Problem Solving & Incidents (AI era)

AWS S3 us-east-1 Outage (2017)

10 min read · last reviewed 2026-10-17

Open in the interactive app: practice, quiz, mock interview →

In one minute

How it works

Timeline (PST, from AWS's summary)

Technical root cause

The trigger was a mistyped argument. The causes were in the system: the tool allowed removing a large amount of capacity in one step, and it did not check whether the removal would take a subsystem below the minimum it needs to function (AWS summary). Index and placement shared fate with servers that the billing work targeted, and once they lost too much capacity they could not degrade gracefully; they required a full restart.

Contributing factors

Detection and mitigation

The impact was immediately visible. Mitigation was not a rollback, because there was nothing to roll back: the servers had to be brought back and the subsystems restarted, with integrity checks, in dependency order (index before placement).

What changed afterwards

AWS listed: the tool now removes capacity more slowly; safeguards prevent removing capacity when it would take any subsystem below its minimum required capacity; other operational tools were audited for similar checks; work to reduce recovery time, including reprioritising further partitioning of index into smaller cells; and moving the dashboard's admin console to run across multiple regions (AWS summary).

What I would have done as the tech lead

Beforehand: treat every tool that removes capacity or deletes data as high-stakes, with built-in rate limits, minimum-capacity checks and a dry-run that prints what will be removed. Schedule regular full-restart drills of core subsystems in a large region or a realistic copy, measuring recovery time as the region grows. Make status pages and incident tooling independent of the systems they report on. During: a single incident commander, early and frequent external communication through channels that do not depend on S3, and a clear recovery order. The lesson is not "be careful with commands"; it is "tools must make the dangerous action hard and the recovery practised".

Down the stack

Layer 1The contract

S3 promised high availability and durability within a region, built from many subsystems. Operational tools carried an implicit contract too: running the playbook removes "a small number" of servers. Nothing in the tool enforced that contract, so a typo broke it.

Layer 2The mechanism

Systems like S3's index are large distributed metadata services: the mapping from bucket and key to the storage locations of an object's data. When too many members of such a service disappear at once, the remaining ones cannot serve all partitions or maintain quorum, and the safe way back is a controlled restart that reloads state and verifies its integrity before serving traffic. Partitioning into cells bounds how much state any one restart must reload; that is why AWS prioritised further partitioning to shorten recovery.

Layer 3The machine

Restart time grows with data size. A metadata store holding information about trillions of objects must read and check a very large amount of state from disk and memory before it can serve again; even at high throughput per server, verification work scales with the data, and the region's growth over the years had multiplied it. A test restart five years earlier would have produced a time that no longer applied.

Why it's built this way

  1. Operators need powerful tools to manage fleets of servers.
  2. Powerful tools amplify mistakes, so they need limits that check intent against invariants such as minimum capacity.
  3. Large shared subsystems have large blast radii and slow restarts.
  4. Recovery time changes as systems grow, so it must be measured repeatedly.
  5. The tools you use to communicate and recover must not depend on the failing system.

Diagram

flowchart TD
  P["Playbook: remove a few billing servers"] --> T["Typo in input"]
  T --> R["Large set of servers removed"]
  R --> I["Index loses too much capacity"]
  R --> PL["Placement loses capacity"]
  I --> RS["Full restart with integrity checks"]
  PL --> RS
  RS --> D["Hours of S3 outage in US-EAST-1"]
  D --> DEP["Console, EC2 launches, EBS, Lambda affected"]
  D --> SHD["Status dashboard cannot update"]

Worked example

Apply the lesson to your own platform. A team's Kubernetes tooling has a script, drain-nodes.sh, that takes a label selector and drains every matching node. A typo in the selector (role=ingest instead of role=ingest-canary) would drain all 40 ingestion nodes instead of 2.

Following AWS's fixes: the script now prints the matching nodes and their count and requires confirmation if more than 5 percent of a node pool is selected; it drains at most 2 nodes at a time and waits for pods to become ready elsewhere; and it refuses to proceed if the pool would drop below the minimum required by the ingestion service's capacity plan (here 30 of 40 nodes at peak). A game day then restarts the whole ingestion tier in staging at production scale, measures 26 minutes, and the team splits ingestion into 4 independent cells so a full restart of one cell takes about 7 minutes.

In the wild

Trade-offs

SafeguardStrengthsWeaknessesChoose when
Minimum-capacity checks in toolsBlocks the worst mistakes automaticallyNeeds accurate minimumsAny tool that removes capacity
Slow, batched removalLimits blast radius, gives time to noticeSlower routine operationsFleet operations
Dry run and confirmationShows intent before actionConfirmation fatigueDestructive commands
Cell-based architectureSmaller blast radius, faster restartsMore complexityLarge shared subsystems
Regular restart drillsReal recovery timesEffort, some riskCore subsystems that rarely restart

Pitfalls in production

Leadership lens

Check yourself

  1. Why did a mistake in a billing-related command affect all of S3 in the region?

    Show answer

    The removed servers also supported the index and placement subsystems, which every S3 request depends on, and the tool did not stop removal below their minimum capacity.

  2. Why did recovery take hours rather than minutes?

    Show answer

    The subsystems required full restarts with metadata integrity checks, which had not been done at that scale for years, and the region's growth made them much slower.

  3. What does the status dashboard problem teach?

    Show answer

    Monitoring and communication tools must not depend on the systems they report on, or an outage hides itself.

  4. Name two of AWS's systemic fixes.

    Show answer

    Capacity removal is slower and refuses to go below subsystem minimums; index is partitioned further into cells to speed recovery (others: tool audits, multi-region dashboard).

Sources and further study

Primary

Systems docs

Books

Other curricula

Free resources

Open in the interactive app: practice, quiz, mock interview →