Incident Library

IL-0355 Railway · 2024-12-17networkinggcp

Google Cloud 위의 Railway 에지 서버로 들어오는 트래픽이 약 10분 동안 모두 막혔다

Railway 는 2년 동안 정적 차단 목록과 동적 차단 목록을 함께 유지했고, DDoS 대응이 나아지면서 동적 방식으로 완전히 옮겼다. 한 고객이 자기 애플리케이션이 Railway 와 통신할 때 간헐적으로 타임아웃이 난다고 알려 왔고, 조사해 보니 그 고객의 IP 가 동적 방식 이전 시절의 정적 목록에 막혀 있었다. Railway 는 이 IP 목록의 배열을 비워 차단 목록에서 빼기로 했다.

Google Cloud Terraform Provider 는 source_ranges 를 선택 사항인 목록으로 받고, 아무 값도 없으면 규칙의 동작을 모든 대상에 적용한다. Golang 으로 만든 Terraform 은 빈 배열과 nil 을 구분하지 않는다. GCP 방화벽 규칙은 출발지 IP 범위를 정하지 않으면 모든 IP 를 고른다. 그래서 빈 목록을 받은 Terraform 이 방화벽 규칙의 출발지 IP 목록을 지웠고, Terraform 에서 "이 빈 IP 목록을 막는다" 로 읽히던 규칙이 실제로는 "모든 것을 막는다" 가 됐다.

2024-12-17 UTC 오전 12시 47분에 변경이 머지됐고, 12시 49분에 자동 알림이 엔지니어에게 갔다. Railway 는 먼저 되돌리고 원인은 나중에 찾는다는 정책에 따라 12시 54분에 변경을 되돌렸고, 12시 58분에 적용했으며, 12시 59분에 자동 모니터링이 정상으로 돌아왔다. 알림은 변경을 머지한 엔지니어 대신 온콜 당번을 깨웠다. 또 bastion 의 Terraform 실행기가 apply 전에 plan 을 먼저 실행해 복구가 3분 늦어졌다.

심각도
–
영향 범위
Inbound requests through Railway's Google Cloud edge servers to applications; private networking, outbound requests, Metal Hosts and Dedicated Instances were not affected
영향 사용자
–
지역
All Railway regions on Google Cloud
감지까지
2m
복구까지
12m

증상

Google Cloud 에 있는 Railway 에지 서버가 들어오는 요청을 애플리케이션으로 보내지 못했다. 모든 리전에서 Google Cloud 로 들어오는 트래픽이 약 10분 동안 끊겼다.

사설 네트워크, 나가는 요청, Metal Hosts, Dedicated Instances 는 영향을 받지 않았다.

변경을 머지하고 2분 뒤 자동 알림이 울렸다. 이 알림은 변경을 머지한 엔지니어가 아니라 온콜 당번을 깨웠다.

증상 서비스 중단

원인

촉발
Railway 엔지니어가 오래된 정적 차단 IP 목록을 비우려고 배열을 빈 값으로 바꾼 Terraform 변경을 머지했다. Google Cloud 방화벽 규칙에서 출발지 IP 범위가 사라져 규칙이 모든 IP 를 막게 됐다.

감지

변경을 머지하고 2분 뒤인 UTC 오전 12시 49분에 자동 알림이 Railway 엔지니어에게 갔다. 이 알림은 변경을 머지한 엔지니어가 아니라 온콜 당번을 깨웠다.

조치

후속 조치

교훈

–

출처

관련 사례

내 클러스터에도 있는지 확인하기

kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이 사례와 같은 상태를 점검합니다. 이 사례의 구성 요소: Terraform, VPC 라우팅 테이블과 방화벽 규칙. 점검 항목의 근거는 이 사례 같은 공개 보고서입니다.

AI 도구와 스크립트용

API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.