Incident Library
  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases19 cases

16 to 19 of 19

  1. Symptoms

    From 9:37AM PST on February 28th, 2017, Amazon S3 in the Northern Virginia (US-EAST-1) Region could not serve requests. AWS services in the region that store data in S3 failed with it, including the S3 console, new Amazon EC2 instance launches, Amazon EBS volumes that needed data from an S3 snapshot, and AWS Lambda.

    Trigger

    While debugging an S3 billing system that was progressing more slowly than expected, an authorized S3 team member followed an established playbook to remove a small number of servers from one S3 subsystem used by the billing process, and entered one input of the command incorrectly.

    Root cause
    Component
    Contributing factor
    Remediation
    • Restarted the index subsystem, which served GET, LIST and DELETE again from 12:26PM PST
    • Restarted the placement subsystem after the index subsystem worked, restoring PUT by 1:54PM PST
    Action items
    • Change the capacity removal tool to remove capacity more slowly
    • Add safeguards that stop capacity removal when it would take a subsystem below its minimum required capacity
    • Audit other operational tools for similar safety checks
    • Improve the recovery time of key S3 subsystems and start the planned further partitioning of the index subsystem into cells now
    • Run the SHD administration console across multiple AWS regions
  2. Symptoms

    On 22 August 2016 at 17:21 UTC buildkite.com went offline: nobody could log in, view build logs or read the documentation, although builds kept running and GitHub and Bitbucket pull request statuses kept updating. The Buildkite team in Melbourne was asleep and woke at 21:00 UTC, almost 4 hours later, to emails, tweets and Slack messages saying Buildkite was down.

    Trigger

    Over a weekend maintenance window, Buildkite downgraded its m4.10xlarge Multi-AZ RDS PostgreSQL database to an r3.2xlarge Multi-AZ instance to cut its AWS bill, and moved to a centralised pgbouncer to pool connections. The first US weekday peak after the change pushed the new instance's CPU to its maximum at about 16:00 UTC.

    Root cause
    Component
    Contributing factor
    Detection

    New Relic, Pingdom, Datadog, Calibre and CloudWatch raised PagerDuty alerts, but the on-call phone call never came and only silent push notifications arrived. The team noticed at 21:00 UTC when they woke to emails, tweets and Slack messages from users.

    Remediation
    • Moved servers from the Agent API to the dashboard ELB to bring buildkite.com back online
    • Switched the Auto Scaling Groups to EC2 health checks and locked in desired counts
    • Upgraded the database to an instance type that could handle the load, using the aws-cli
    • Built a new AMI that did not depend on buildkite.com/_secret/version and rolled out servers that could self-deploy
    • Removed the centralised pgbouncer and went back to pgbouncer on each host
    Action items
    • Plan load testing after significant infrastructure changes without affecting other users of the system
    • Make the ELB health check return OK when the app answers, without checking database connectivity
    • Consider a separate health check endpoint for Pingdom that checks the database and other dependencies
    • Store the latest deployed revision as a file on S3 for newly launched servers to self-deploy from
    • Test by hand that PagerDuty calls reach every on-call team member
    • Investigate regular company-wide tests of everyone's paging setup
    • Ask PagerDuty about calling members when they go on call or requiring an immediate phone rule
    Lessons

    Buildkite listed six lessons. Watch AWS credits, because billing reports show $0 while credits are spent, so the real cost is hidden and big changes end up rushed. Load test after significant infrastructure changes. Think about what a health check should do and what happens when every server behind an ELB fails it. Do not make new servers look up the deployed revision from the service they are replacing. Make sure every on-call member has the right PagerDuty and phone settings before going on call. When servers churn in AWS, stop health checks and autoscaling, for example with the Auto Scaling feature to suspend and resume processes, so the EC2 request limit is not used up.

  3. Symptoms

    At 00:23 UTC on 28 January 2016 GitHub became unavailable and returned HTTP 503 responses with the unicorn error page. On-call engineers received alerts for unreachable servers and a spike in exceptions related to Redis connectivity, after slightly over 25% of the servers and several network devices in the primary data center rebooted.

    Trigger

    At 00:23 UTC a brief disruption in the systems that supply power to the servers and equipment of GitHub's primary data center rebooted slightly over 25% of the servers and several network devices.

    Root cause
    Component
    Contributing factor
    Detection

    The reboots generated alerts to several on-call engineers, starting with notifications for unreachable servers and a spike in exceptions related to Redis connectivity.

    Remediation
    • Worked with on-site facilities technicians to drain flea power from the failed servers and start them cold so their disks were visible
    • Rebuilt the affected Redis clusters on alternate hardware
    • Restored the Redis cluster data onto standby equipment and brought the Redis-server processes back online
    • Removed the maintenance page after the HAProxy load balancers returned the recovered application servers to the pool
    Action items
    • Update the server firmware with the known issue across the fleet
    • Make tooling open issues automatically when new firmware updates are available, so their changelogs are reviewed
    • Add tests that make sure application processes start even when certain external systems are unavailable
    • Improve circuit breakers so functionality degrades gracefully when backend services are down
    • Review the availability requirements of internal systems such as server provisioning so they are on par with user-facing systems
    • Strengthen communication between teams during incidents
    • Predefine escalation strategies for all-hands incidents
    • Improve status messaging to users during incidents
    Lessons

    Dependencies between components fail in new ways unless they are tested, and a power loss cannot be fully prevented, so the goal is fast and reliable recovery. The application should start without non-essential backends, and internal systems needed to recover from an outage, such as server provisioning, must be as reliable as the system being recovered.

  4. Symptoms

    Early on Sunday 20 September 2015, the error rate of customer requests to Amazon DynamoDB in the US-East Region rose far beyond any level of the previous 3 years by 2:37am PDT and settled at about 55%. Some other AWS services in the region that depend on DynamoDB were affected as well.

    Trigger

    At 2:19am PDT a brief network disruption affected a portion of DynamoDB's storage servers, and they all requested their membership data from the metadata service at the same time.

    Root cause
    Component
    Contributing factor
    Detection

    For the errors that remained after the main recovery, a growing number of customer support cases on Monday about tables stuck in the updating or deleting stage and higher than normal error rates showed that the low overall error rate was hitting some customers hard.

    Remediation
    • Paused requests to the metadata service, which cut the retries and relieved its load
    • Added significant capacity to the metadata service once it could answer administrative requests
    • Turned requests to the metadata service back on and returned storage servers to the customer request path
    • Restored a metadata partition that was still not taking its full traffic, ending the remaining errors on Monday
    Action items
    • Significantly increased the capacity of the metadata service, which AWS had already done by the time of the summary
    • Add stricter monitoring on performance dimensions such as membership size, to plan capacity ahead
    • Reduce the rate at which storage nodes request membership data
    • Lengthen the time allowed to process membership queries
    • Segment DynamoDB into many metadata service instances, each serving only part of the storage server fleet
    • Change SQS metadata caching so send and receive keep working without long access to the metadata table
    • Partition work across the Auto Scaling servers to process a backlog of scaling jobs in parallel
    • Prune older scaling activities that have been superseded
    • Increase the capacity available to process scaling activities
    • Change CloudWatch caching of DynamoDB group membership data to refresh only the smallest set of metrics
    • Deliver CloudWatch metrics faster through write-through caching
    • Roll out the shorter timeout on the DynamoDB-dependent API call in Console login
    Lessons

    A low overall error rate can hide disproportionately high error rates for a few customers, and AWS should have posted to the dashboard sooner. A call that does not need to succeed, like the DynamoDB-dependent API call in Console login, should fail quickly instead of blocking on a very long timeout. Splitting the metadata service into many instances, each serving part of the fleet, is meant to contain the impact of software, capacity or infrastructure failures.

Check your cluster for this

These 19 cases involve Database and Automated capacity manager. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.

By root cause8

Capacity exhaustion5 cases

  1. IL-0497 Buttondown's database ran out of connections twice in one day and requests failed while health checks mostly passed
  2. IL-0384 Amazon Kinesis front-end servers in US-EAST-1 could not route requests, so Kinesis and services built on it failed
  3. IL-0492 Hosted Graphite's self-hosted load balancers hit their connection limit in an AWS outage, timing out its site and APIs
  4. IL-0333 A downsized RDS PostgreSQL database maxed out its CPU at US peak and failing ELB health checks took buildkite.com down
  5. IL-0282 DynamoDB in US-East reached about 55% request errors as storage servers overloaded its metadata service

Cloud provider outage3 cases

  1. IL-0559 PubNub services degraded in US-East during an AWS outage in the IAD region, and failover load then degraded US-West
    PubNub2025
  2. IL-0284 Workers KV failed 90.22% of requests in a third-party storage outage, breaking Access, WARP and many Cloudflare products
  3. IL-0220 An overloaded AWS Transit Gateway dropped packets on 4 January 2021, and Slack's web tier saturated and went down
    Slack2021

Breaking change in an upgrade1 case

Organisation
  1. IL-0227 Most Heroku dynos in Private Spaces lost outbound connectivity after an automated OS update restarted host networking
    Heroku2025

Configuration change4 cases

  1. IL-0543 Twingate API traffic piled onto one backend behind the global load balancer, failing core services for 29 minutes
  2. IL-0285 Clever Cloud's Pulsar brokers stalled in a minor upgrade, then hypervisors overloaded and crashed with kernel panics
  3. IL-0254 Square's internal DNS servers failed and Square products, services and payments were unavailable for about 15 hours
    Square2023
  4. IL-0272 New Cassandra nodes served reads for data they did not hold, so Monzo records looked missing and payments failed
    Monzo2019

Software defect2 cases

  1. IL-0223 A connection surge congested the devices between AWS's internal and main networks in us-east-1, breaking EC2 APIs
  2. IL-0222 Google Cloud US regions had heavy packet loss and some went unreachable after the network control plane was descheduled

Operator error2 cases

  1. IL-0221 A backbone maintenance command disconnected all Facebook data centers, and its DNS servers withdrew their BGP routes
    Meta2021
  2. IL-0534 Amazon S3 in US-EAST-1 could not serve GET, LIST, PUT or DELETE requests for hours while its index subsystem restarted

Faulty deployment1 case

Organisation
  1. IL-0229 bunny.net's DNS servers crashed in a loop on a corrupted routing database file and could not fetch a fix from its CDN

Dependency failure1 case

Organisation
  1. IL-0273 A power disruption took GitHub's Redis clusters offline, the app could not boot, and GitHub served 503s for 2 hours
    GitHub2016