Real-World Incident Postmortems — Learning from Major Outages
Target Level: Staff / Principal SRE & DevOps — 15+ Yrs Experience
Interviewers at the senior level often ask: "Tell me about a complex incident you've led." They want to see your incident command, root cause analysis, and systematic thinking. Studying major industry outages gives you a shared vocabulary and demonstrates depth. Below are the most instructive postmortems with engineering and cultural takeaways.
1. AWS Kinesis (November 2020) — 18-hour outage
Timeline
- Day 1, 10:30 AM PT: AWS deployed a new Kinesis control-plane feature to us-east-1. A bug in the deployment caused the Kinesis control plane to stop processing API requests.
- 11:30 AM: Impact spreads — CloudWatch Logs (which uses Kinesis), DynamoDB (in some regions), and EventBridge all degrade because they depend on Kinesis internally.
- 12:00–6:00 PM: AWS engineers attempt to roll back the deployment but the control plane is so degraded that the rollback itself can't be processed.
- 6:00 PM – Next day 4:00 AM: Engineers manually recover the control plane by running commands on individual hosts through an out-of-band management plane.
Root Cause
A single minor Kinesis service was deployed with insufficiently tested changes. The deployment mechanism itself didn't have a tested rollback plan for the scenario where the control plane is unavailable. The incident exposed a meta-failure: the tool used to fix the system depended on the system being fixed.
Lessons for Senior Engineers
- Always have an "out-of-band" path to administer your systems — a separate control plane that doesn't depend on the primary system.
- Test rollbacks in production. If you can't roll back through the normal pipeline, you don't have a rollback.
- Defense in depth for control planes: The deployment orchestrator should be a separate system with its own lifecycle.
- Incident communication: AWS's transparent, hourly updates during the outage were a model for how to communicate during a crisis.
Interview Discussion Point
"How would you design a deployment system that can recover even when the primary control plane is down?" This tests understanding of: separate management networks, out-of-band access, static binary deployments, and runbook-driven manual recovery paths.
2. GitHub (October 2021) — Secret key loss causes 24+ hour code freeze
Timeline
- October 21, 1:30 UTC: GitHub engineers were replacing a load balancer in an internal datacenter. They discovered during the procedure that a critical secret key (used for TLS termination in the older load balancer) was stored only in the older load balancer's memory — not in a secret store.
- 2:00 UTC: The old load balancer was decommissioned. The secret was gone. All TLS connections to internal services began failing.
- 2:00–8:00 UTC: GitHub engineers determined that the lost secret key was used in an internal PKI that signed TLS certificates for internal services. Without it, no internal service could establish TLS connections.
- 8:00–22:00 UTC: A new PKI was built, but every internal service needed to trust the new root. Over 20,000 internal TLS certificates had to be re-issued.
- October 22, 1:00 UTC: All services restored, but the entire 24-hour period had no code deploys (code freeze).
Root Cause
A single secret key was stored in one engineer's memory and a running process — not in a secret management system. The key was inadvertently destroyed during a routine hardware replacement because its existence wasn't documented.
Lessons for Senior Engineers
- Secrets must never exist in only one place. Use HashiCorp Vault, AWS Secrets Manager, or Azure Key Vault for all secrets — including PKI root keys.
- Document key metadata. Every secret should have: owner, rotation schedule, which services depend on it, recovery procedure.
- Practice disaster recovery for PKI. Run a game day where you deliberately lose the PKI root key and practice rebuilding it.
- Short-lived certificates are safer. With short TTLs (24h), even if keys leak, the blast radius is limited. But short TTLs require automated renewal — no manual cert management.
Interview Discussion Point
"Design a secrets management and PKI strategy that prevents this class of failure." Expected answer: Vault PKI with intermediate CAs per service, short-lived certs (24h), automated renewal via cert-manager, root CA offline in a safe with M-of-N quorum to access.
3. Fastly CDN (June 2021) — Global CDN outage
Timeline
- June 8, 15:12 UTC: Fastly deployed a configuration change to their CDN edge nodes. An undiscovered bug in a customer-agnostic default configuration template caused 95% of edge nodes across all POPs to generate an invalid configuration.
- 15:13 UTC: Edge nodes globally rejected the invalid configuration and went into a "no valid configuration" state — effectively falling back to serving no traffic.
- 15:14–17:00 UTC: Major websites (Amazon, Reddit, Twitch, The Guardian, Financial Times, CNN, GitHub, Stack Overflow, New York Times) were inaccessible for 49–60 minutes.
- 17:00 UTC: Fastly identified the bug, rolled back the configuration change, and edge nodes globally recovered.
Root Cause
A configuration change was deployed to all edge nodes simultaneously with no canary or staged rollout. The change validation in the CI pipeline didn't catch the bug because it tested against a single customer configuration, not the global multi-tenant configuration matrix.
Lessons for Senior Engineers
- Canary every configuration change. Even "trivial" config changes should roll out incrementally (1% → 5% → 25% → 100%).
- Test the intersection, not just the union. The bug was in how the config template interacted with a specific customer — testing each config in isolation wouldn't catch it. Use pairwise testing or property-based testing for config templates.
- Feature flags for customer configuration. If a specific customer's config causes issues, a kill switch should be available to disable that config without redeploying.
- Graceful degradation. Edge nodes should have a "stale config" fallback — serve the last-known-good configuration instead of entering a no-traffic state.
Interview Discussion Point
"Design a CDN or edge-config deployment system that prevents global outages." Expected answer: staged rollout, canary POP, automated health checks before promotion, last-known-good fallback, per-customer kill switch, separate control plane from data plane.
4. Google Cloud (August 2022) — Multi-region DNS failure
Timeline
- August 15, 07:30 UTC: A routine maintenance procedure was executed on GCP's DNS infrastructure in us-central1. The maintenance script had an incorrect parameter causing it to stop DNS resolution across all GCP services in the region.
- 07:35 UTC: Because GCP's internal DNS resolution is hierarchical, the failure cascaded — services in other regions could not resolve DNS for services in us-central1, which broke cross-region communication.
- 07:35–10:00 UTC: Multiple GCP services (Compute Engine, GKE, Cloud SQL, BigQuery, Cloud Storage) impacted across multiple regions due to DNS dependency.
- 10:00–14:30 UTC: Engineers restored DNS by rolling back the maintenance procedure, then manually flushing DNS caches on affected systems.
Root Cause
A single DNS system was a single point of failure across multiple regions. The maintenance procedure had no canary or staged rollout. DNS had "hidden" dependencies — services assumed DNS was always available and had no fallback for DNS failure (no cached DNS entries, no static IP references).
Lessons for Senior Engineers
- DNS is the most critical infrastructure — design for DNS failures. Implement: client-side DNS caching (HOSTALIASES, /etc/hosts fallback), retry with jitter, use of IP addresses where possible in internal configurations.
- Never assume DNS is always available. Every service should have a local DNS cache with adequate TTL, and should handle DNS failures gracefully (circuit breakers, stale cache serving).
- Canary for infrastructure procedures too. Not just application code — DNS changes, load balancer configs, firewall rules should all be canary-deployed.
- Cross-region architectures should not have a single DNS dependency. Use multiple DNS providers, client-side service discovery (Consul), or DNS resolvers per region.
5. CrowdStrike (July 2024) — Global Windows system crash
Timeline
- July 19, 04:30 UTC: CrowdStrike released a rapid-response content update (channel file
C-00000291*.sys) to all Falcon endpoints globally. The update was intended to detect newly observed malicious named pipes. - 04:30–05:00 UTC: The update caused Windows systems globally to crash with BSOD (Blue Screen of Death) — affecting ~8.5 million Windows devices across airlines, banks, hospitals, media broadcasters, and governments.
- 05:00–12:00 UTC: Global IT emergency. Delta Airlines canceled 7,000 flights (cost: $500M). 911 services were disrupted in multiple US states. UK's NHS appointment systems went offline. Global impact estimated at $5–10B.
- Weeks–Months: CrowdStrike published a root cause analysis revealing the update was not properly validated before global release and lacked staged rollout.
Root Cause
The content update contained a malformed input that crashed the Windows kernel driver. The validation pipeline tested the update format but didn't test it against all Windows configurations. The update was released simultaneously to all endpoints with no canary rings, no gradual rollout, and no automated quality gates.
Lessons for Senior Engineers
- Rapid-response updates need the same safety as regular updates. Even "emergency" antivirus signature updates should have staged rollout (1% → 10% → 100% with monitoring between stages).
- Kernel-level software requires extreme validation. Any code that runs in kernel space should pass multiple validation stages: static analysis, fuzz testing, integration testing on reference hardware, and staged rollout.
- Design for degraded operation. If the security agent crashes, the system should survive (with reduced security posture) — not crash entirely. The Falcon driver should have had a failsafe mode.
- Real user monitoring for deployment safety. CrowdStrike's first indication of a problem was millions of crashed machines — there was no pre-deployment canary or synthetic monitoring.
Interview Discussion Point
"Design a deployment system for kernel-level agents that prevents a repeat of CrowdStrike 2024." Expected answer: staged rollout rings (canary → internal → 1% → 10% → 100%), automated rollback on crash detection, synthetic test environments that mirror customer configurations, circuit breaker on agent install (auto-disable if system metrics degrade), and dual-boot with last-known-good agent.
6. Postmortem Culture — What Senior Engineers Should Know
Building a Blameless Postmortem Culture
- Focus on systems, not people. The question is always "what in the system allowed this to happen?" not "who caused it?"
- Action items must have owners and deadlines. A postmortem without concrete, assigned, tracked actions is theater. Classify items: P0 (must fix within 7 days), P1 (30 days), P2 (90 days).
- Track postmortem completion rates. If action items from previous postmortems aren't being completed, your reliability culture has a hole.
- Postmortems should be searchable and accessible. Every postmortem is a learning resource. Tag by: service, severity, root cause type, team. Run quarterly trend analysis: what types of failures are repeating?
- Public postmortems build trust. Writing public postmortems (as AWS, Google, GitHub, Fastly, and CrowdStrike all did) demonstrates transparency and builds customer trust — and holds the team to a higher standard.
Postmortem Template
## Summary
[1–2 line description of what happened]
## Impact
- Services affected:
- User impact:
- Duration:
- Cost/revenue impact:
## Timeline
[Key events with timestamps]
## Root Cause
[Deep technical analysis]
## Contributing Factors
[Systemic issues that allowed the root cause]
## Detection
How was this discovered? How long between incident start and detection?
## Resolution
How was it fixed? How long did the fix take?
## Lessons Learned
[What did we learn?]
## Action Items
| Item | Owner | Due | Type (P0/P1/P2) |
|------|-------|-----|------------------|
| ... | ... | ... | ... |
7. Interview Questions on Incident Management
Q1: Walk me through how you would run an incident bridge for a P0 outage.
Answer: 1) Declare the incident — engage on-call via PagerDuty, open a Zoom/Teams bridge, create a Slack channel. 2) Assign roles: Incident Commander (IC — runs the bridge, makes decisions, tracks timeline), Scribe (documents events and actions), Subject Matter Experts (individuals diagnosing specific systems), Comms Lead (handles internal/external status updates). 3) Establish the severity — SEV1 = critical customer impact, SEV2 = degraded functionality. 4) Start the timeline — document every action taken, every change made, every observation. 5) Parallelize investigation — SMEs diagnose independently while the IC tracks the big picture. 6) Attempt mitigation first — rollback, scale up, route around — find the root cause after the bleeding stops. 7) Communicate — status page updates every 15 minutes. 8) When service is restored — monitor for 30 minutes before closing the incident. 9) Postmortem — schedule within 48 hours.
Q2: Your postmortem finds the same root cause pattern for the third time this quarter. What do you do?
Answer: This signals a systemic weakness that individual action items aren't solving. Escalate: (1) Trace the action items from the previous two postmortems — were they completed? If not, the process is broken. (2) If they were completed but didn't prevent recurrence, the mitigation was insufficient — propose a more fundamental solution. (3) Consider a "lock" — temporarily prevent any changes to the affected system until a permanent fix is in place. (4) Re-evaluate if this is a training, tooling, or architecture problem. A pattern of repeat incidents in database connection pool exhaustion suggests you need a connection pool middleware or auto-scaling connection pools, not just more runbook documentation. (5) Propose an error budget policy change — if a service has 3+ repeat incidents, its error budget is reduced, or a mandatory architectural review is triggered.
Q3: You're joining a company with no incident management process. How do you build one from scratch?
Answer: Phase 1 (Week 1): Document the current state — how do people currently handle incidents? What's painful? Find 1–2 willing early adopters. Phase 2 (Month 1): Define severity levels (SEV1–5). Create a simple runbook for SEV1: "Who to page, where to meet, how to communicate." Use existing tools (Slack, etc.) — don't buy new tools yet. Phase 3 (Month 2–3): Introduce the IC role. Run a tabletop exercise. Add a simple postmortem template. Phase 4 (Month 4–6): Standardize on-call rotations. Add monitoring and paging. Introduce error budgets. Phase 5 (Month 7+): Automate — auto-create incident channels, auto-document timeline, integrate with monitoring. Key: don't over-engineer at first — a simple, consistently followed process beats a complex but ignored one.