Incident Library

IL-0355 Railway · 2024-12-17networkinggcp

Railway's Google Cloud edge stopped routing inbound requests to apps in all regions for about 10 minutes

Railway had kept both a static and a dynamic IP block list and over two years moved fully to the dynamic one. A customer reported intermittent timeouts when talking to Railway, and its IP turned out to be on an old static list. Railway removed it by emptying the list's array in Terraform. The Google Cloud Terraform provider treats source_ranges as an optional list, and Terraform, written in Go, does not tell an empty array from nil, so the change removed the source IP list from the GCP firewall rule. A GCP firewall rule without a source range selects all IPs, so the rule meant to block an empty list of IPs blocked everything, and all inbound traffic to Railway's Google Cloud edge was cut. The page reached the current on-call engineer, waking them, rather than the engineer who had merged the change, and the bastion Terraform runner ran a plan before applying the revert, adding about 3 minutes. The revert was applied at 12:58 am UTC and monitoring recovered at 12:59 am.

Severity
–
Scope
Inbound requests through Railway's Google Cloud edge servers to applications; private networking, outbound requests, Metal Hosts and Dedicated Instances were not affected
Users affected
–
Region
All Railway regions on Google Cloud
Time to detect
2m
Time to resolve
12m

Symptoms

Railway's edge servers on Google Cloud could not route inbound requests to applications in any region for about 10 minutes, on 17 December 2024 UTC. Private networking, outbound requests, Metal Hosts and Dedicated Instances kept working.

Automated alerting notified a Railway engineer at 12:49 am UTC, two minutes after a change to IP allow-list rules was merged at 12:47 am, and automated monitoring recovered at 12:59 am after the change was reverted and applied.

Symptom Service outage

Root cause

Trigger
A merged Terraform change emptied the array of a static IP block list, to unblock a customer whose IP had been blocked since before Railway moved to a dynamic block list and who had reported intermittent timeouts.

Detection

Automated alerting paged the current on-call engineer at 12:49 am UTC, two minutes after the change was merged.

Remediation

Action items

Lessons

–

Sources

Related cases

Check your cluster for this

kubegap audits a Kubernetes cluster for conditions like the ones in this case, Terraform, VPC route tables and firewall rules among them, read-only, from Claude Code or Codex. Its checks cite public reports like this one.

For AI tools and scripts

The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.