Practice & Reference · Case Study · Real company

The 2017 AWS S3 Outage

This page sticks closely to one primary source: Amazon's own "Summary of the Amazon S3 Service Disruption in the Northern Virginia (US-EAST-1) Region," published at aws.amazon.com/message/41926/ shortly after the event. On February 28, 2017, a single incorrectly entered input to a routine, playbook-driven debugging command removed far more server capacity than intended from Amazon S3's US-EAST-1 region — and the two subsystems that lost that capacity happened to be the ones nearly every S3 request depends on. What followed is one of the clearest public examples of three separate SRE lessons landing in the same afternoon: how little margin a "routine" operational command can have without a guardrail, how long a large stateful system can take to come back once it actually has to restart from scratch, and what happens when the system you'd use to tell customers something is wrong depends on the very thing that's wrong. Figures on outside financial impact and affected-company counts in this page are industry estimates from third-party analysts, not numbers AWS has published or audited — this page says so plainly wherever they appear.

☺ Explain it like I'm 10

Imagine a giant library that does two things at once: it stores every single book on its shelves, and it keeps the one master card catalog that says exactly which shelf every book in the whole building is on — nobody can find anything without that catalog. One day, a librarian is fixing a slow cash register and is told "clear off a few empty carts near the register." She types the number of carts to clear wrong, and instead of a few empty carts, workers wheel away a huge number of carts — including the ones the master catalog itself was sitting on. Now the catalog has to be rebuilt from scratch before anyone, anywhere in the library, can find a single book. And here's the part that makes it a truly bad day: the sign out front that's supposed to say "we're having a problem, please be patient" is printed by a machine that also needs the catalog to work — so even the library's own apology sign is stuck blank for the first two hours. That's the shape of the February 2017 S3 outage, just with servers instead of book carts.

🦫🐘Your hosts for this case file: Benny the Beaver & Ellie the Elephant — Benny has broken production once himself, trusting an unreviewed script, so he investigates what guardrail this command was missing on toil & automation's home turf. Ellie, who holds every metric, log, and trace on monitoring & observability, is the one who can't quite believe AWS's own status page couldn't say AWS was down.

What actually happened, in one paragraph

☺ Like you're 10: Someone typed one number wrong while fixing something unrelated, and it accidentally cleared out way more than planned — including the two systems that basically everything else needed to work at all.

At 9:37 AM PST on February 28, 2017, an authorized Amazon S3 team member was debugging an issue that was causing the S3 billing system to process more slowly than expected. Using an established playbook, they executed a command intended to remove a small number of servers for one of the S3 subsystems used by the billing process. One of the inputs to that command was entered incorrectly, and a much larger set of servers was removed than intended. The servers that were mistakenly pulled out of service happened to support two other S3 subsystems, not the billing one the engineer was actually working on: the index subsystem, which manages the metadata and location information for every object stored in S3 in the region, and the placement subsystem, which manages allocating storage for new objects and depends on the index subsystem to do it correctly. Losing that much capacity all at once didn't just slow those two subsystems down — it forced both into a full, from-scratch restart, and during that restart S3 could not reliably serve requests in the region at all.

Why two subsystems, and why that combination was so damaging

☺ Like you're 10: One system is the "where is everything" map, and the other is "where do I put the next thing" — lose the map and you can't even use the second system correctly.

SubsystemWhat it actually doesWhy losing it was catastrophic
Index subsystemTracks the metadata and physical location of every object stored in S3 in the region — which disks, which servers, which versionEvery GET, LIST, PUT, and DELETE request needs it to find or place an object; without it, S3 has no way to answer "where is this," so none of the four core operations can complete
Placement subsystemDecides where new objects get physically stored when they're writtenIt depends on the index subsystem being healthy to place new objects correctly, so it couldn't recover independently — it was waiting on the index subsystem's restart to even begin

This is the part of the incident that turns a capacity mistake into a multi-hour outage rather than a brief blip: S3's own summary states plainly that these two particular subsystems had not needed a full restart in many years, and that S3's metadata volume had grown enormously in that time. Restarting them wasn't a matter of flipping the servers back on — it meant reloading and re-validating a much larger body of metadata than these subsystems had ever had to reload before, plus running the safety checks needed to confirm that metadata's integrity before trusting it again. AWS's own account is direct about the consequence: that combination of scale and infrequent restart meant the process "took longer than expected."

One incorrect input to a routine, playbook- driven debug command removes far more than intended Excess capacity pulled from the index & placement subsystems both need a full restart Subsystems restart from scratch — years of accumulated metadata, integrity checks required → takes hours, not minutes S3 APIs unavailable, region-wide GET · PUT · LIST · DELETE all fail Other AWS services EC2 launches, EBS snapshot restores, Lambda AWS's own Status Dashboard also depends on S3 — in the same region Thousands of customer sites & apps go down at once — AWS's own status page can't confirm it for two hours

The blast radius: how far one region's trouble actually reached

☺ Like you're 10: Because so many other AWS tools and outside companies quietly depend on S3 without anyone thinking about it day to day, one region's bad afternoon became everybody's bad afternoon.

S3 outages don't stay contained to S3, because so much else is quietly built on top of it. AWS's own summary lists Amazon EC2's ability to launch new instances, Amazon EBS's ability to complete volume operations that needed data from S3-backed snapshots, and AWS Lambda as directly impacted in the region while S3 APIs were unavailable — none of those services are S3 themselves, but all three lean on it for specific operations. Outside AWS, a wide swath of the public web that stores images, static assets, or application data in S3 either broke outright or degraded for the roughly four hours the region was affected — contemporary reporting from that day named services including Quora, Medium, Slack, Trello, Docker Hub, Coursera, Expedia, and Business Insider among the sites and apps visibly affected, alongside numerous smart-home and IoT products that used S3 for configuration or control and stopped responding. Cyber-risk analysis firm Cyence estimated in the days after the outage that S&P 500 companies alone lost roughly $150 million from the disruption, with U.S. financial-services firms accounting for an estimated $160 million more — figures widely reported at the time as a combined estimate near $310 million. Treat those specific dollar figures as one analyst's modeled estimate, not an AWS-published or independently audited number; AWS's own summary does not put a financial figure on the incident at all.

◆ Key idea: blast radius is a design choice, not a law of nature

Nothing about "a single region hosts an unusually large share of the internet's image hosting, static assets, and application storage" was inevitable — it's the accumulated effect of thousands of individual teams each independently choosing US-EAST-1 as a default, without any one of them intending to create a shared point of failure for that much of the web. The fix isn't "never use S3" — it's designing your own blast radius deliberately: which of your dependencies fail together, and did you choose that on purpose or did it just happen. See multi-region & multi-AZ architecture for how to make that a deliberate decision instead of a default.

The detail everyone remembers: AWS's own status page couldn't say AWS was down

☺ Like you're 10: The "everything's fine" sign was also plugged into the thing that broke, so for the first two hours the sign just... stayed stuck on "fine."

Per AWS's own summary, the Service Health Dashboard's administration console — the tool AWS engineers use to update the little status indicators customers check during an incident — itself depended on S3 for storing the images and other content it needed to render, and it was hosted in the very region that had just gone down. The result: AWS could not update the individual services' status on its own public dashboard from 9:37 AM PST, when the incident began, until 11:37 AM PST — two full hours into a roughly four-hour event. During that window, AWS communicated instead through Twitter and, once it could, a banner posted directly on the dashboard explaining that the lack of a status change was itself related to the S3 issue. For an industry whose default instinct during an outage is "check the status page," the status page saying nothing was wrong while a large fraction of the internet visibly was, was the detail that made this outage as memorable as it was.

⚠ Watch out for shared fate between a system and the thing that monitors it

This is the single most transferable lesson in this whole incident for anyone building monitoring or status infrastructure: your ability to report that something is down cannot depend on that same something being up. If your status page, your paging pipeline, or your dashboard's own hosting shares an infrastructure dependency — a region, a database, a load balancer — with the systems it's meant to describe, you've built a single point of failure for your own visibility exactly where you can least afford one. See monitoring & observability for how to design telemetry paths that stay independent of what they observe.

The recovery, hour by hour

☺ Like you're 10: It wasn't instant and it wasn't all-at-once — different pieces came back at different times over roughly four hours.

The timeline below is drawn directly from AWS's own published summary. Treat the specific minute marks as AWS's own account, not an independently timestamped reconstruction — this is exactly the kind of figure the brief for this page asked to be verified against AWS's own words rather than secondhand retellings, and secondhand retellings of this incident have varied by a few minutes here and there over the years.

9:37 AM PST   Command executed with an incorrect input; capacity removal begins
9:37–11:37 AM Service Health Dashboard admin console can't update — it too
              depends on S3, hosted in the same affected region. AWS
              communicates via Twitter and a manual dashboard banner instead
12:26 PM PST  Index subsystem recovers enough to serve GET, LIST, and
              DELETE requests again
1:18 PM PST   Index subsystem fully recovered
1:54 PM PST   Placement subsystem recovers; S3 reports full operation
              region-wide — roughly 4 hours 17 minutes after 9:37 AM

What AWS said it changed afterward

☺ Like you're 10: AWS didn't just apologize — they changed the tool that let this happen, split the risky system into smaller pieces, and fixed the sign out front so it can't get stuck again.

AWS's own summary lists specific, concrete changes made in direct response to this incident, not general reassurances:

What to steal for your own systems

☺ Like you're 10: You don't need to run anything at AWS's scale to copy these habits — put a floor under your dangerous commands, and make sure your "everything's fine" sign doesn't share a fate with everything.

Honest caveats: what doesn't transfer cleanly

☺ Like you're 10: AWS's own summary is real and specific, but it also leaves a few things out on purpose — this page doesn't fill those gaps with guesses.

🦫 Benny's audit · 15 min

Find one command your team can run by hand today that removes or deallocates infrastructure — an instance-termination script, a cache-flush, a "scale down" playbook. Ask two questions in writing: is there any automated floor that stops it from removing more than a safe amount no matter what gets typed, and could a single incorrectly entered number send it past that floor right now? If the honest answer to the second question is yes, you've just found your own version of February 28, 2017, sitting quietly in a runbook, waiting for a slow Tuesday and a distracted debugging session.

🎬 At the Reliability Watch
🦫

Benny the Beaver: An established playbook, an authorized engineer, and it still took down a chunk of the internet. That's not a "someone was careless" story.

🐘

Ellie the Elephant: The part that gets me is the two hours where their own status page couldn't say anything was wrong. I catalogue every metric and trace we have — what happens if the tool I use to report a problem depends on the exact thing that's broken?

🐢

Timmy the Turtle: Then it isn't independent. A status dashboard that shares a region with the system it watches isn't a dashboard, it's a second thing that can go down at the same time.

🦊

Foxy: And notice what AWS's fix actually was — not "be more careful next time." A minimum-capacity floor on the tool, and a dashboard that runs somewhere else entirely.

🦫

Benny the Beaver: Right. I broke prod once trusting an unreviewed script — the fix wasn't "Benny, pay closer attention," it was code review on every ops script, no exceptions. Same shape here, just at a very different scale.

🦥

Sol the Sloth: ...Four hours seventeen minutes, by their own account. For any service with a 99.9% monthly SLO, that single afternoon spends more error budget than the entire rest of the month combined.

Where this connects in the course

☺ Like you're 10: This one afternoon touches several other lessons — follow whichever one matches what you're actually building.

The missing guardrail at the center of this incident — a manual, playbook-driven command with no automated floor on how much damage it could do — is exactly the territory of toil & automation. The shared-fate failure in AWS's own status dashboard is a direct, real-world instance of the design principles on monitoring & observability. How a region-wide event like this one should actually page someone, and how the response gets structured once it's declared, is incident management & on-call, and this course's own worked example of writing the resulting postmortem is postmortems & blameless culture and the course's own incident case study. The architectural lesson about not concentrating an unreasonable share of dependencies in one region lives on multi-region & multi-AZ architecture, disaster recovery & business continuity, and distributed systems reliability fundamentals. For two other real companies' outages with their own distinct lessons, see Slack's January 2021 outage and Meta's 2021 BGP outage; for how a company chose to talk about incidents like this one in public afterward, see Cloudflare's public postmortem culture. And for the operating-model view of the specific anti-pattern this incident illustrates — tooling with no blast-radius limit — see SRE anti-patterns & pitfalls.

✓ Checkpoint

1. What was the S3 team member actually debugging when they ran the command that caused the outage, and what specifically went wrong with the command? 2. Name the two subsystems that lost capacity, what each one does, and why losing the index subsystem in particular broke all four core S3 operations. 3. Why did the restart take hours rather than minutes? 4. Why couldn't AWS's own Service Health Dashboard show that AWS was having a problem, and for how long? 5. Name two concrete changes AWS made afterward, per its own published summary. 6. Why should the specific dollar-loss figures in this page be treated as an estimate rather than a fact?

Check your answers
  1. They were debugging a slowdown in the S3 billing system, using an established playbook to remove a small number of servers for the subsystem behind it. One of the command's inputs was entered incorrectly, and a much larger set of servers was removed than intended.
  2. The index subsystem (metadata and location for every S3 object in the region — required for GET, LIST, PUT, and DELETE) and the placement subsystem (allocates storage for new objects, and depends on the index subsystem to do so). Losing the index subsystem broke all four core operations because none of them can complete without knowing where an object is or should go.
  3. Both subsystems required a full, from-scratch restart, and per AWS's own account, their metadata had grown enormously over years without needing a full restart — so reloading and safety-checking that much accumulated metadata took longer than anyone expected.
  4. The dashboard's administration console itself depended on S3, hosted in the same affected region, so it couldn't be updated — from 9:37 AM PST when the incident began until 11:37 AM PST, roughly two hours into the roughly four-hour event. AWS used Twitter and a manual banner in the meantime.
  5. Any two of: slower capacity-removal tooling with a minimum-capacity-floor safeguard; an audit of other operational tools for the same gap; accelerating plans to partition the index subsystem into smaller cells to shrink future blast radius; redesigning the Service Health Dashboard to run across multiple regions instead of one.
  6. Because they come from Cyence, a third-party cyber-risk modeling firm's after-the-fact estimate widely cited in press coverage — not a number AWS itself published, disclosed, or had independently audited.