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 엔지니어에게 갔다. 이 알림은 변경을 머지한 엔지니어가 아니라 온콜 당번을 깨웠다.
조치
- 먼저 되돌리고 원인은 나중에 찾는다는 정책에 따라 UTC 오전 12시 54분에 변경을 되돌렸다.
- 되돌린 변경을 UTC 오전 12시 58분에 적용했고, 12시 59분에 자동 모니터링이 정상으로 돌아왔다.
후속 조치
- 알림이 더 빨리 닿도록 변경을 머지할 때 "page override" 를 자동으로 건다.
- Terraform 으로 되돌릴 때는 plan 단계를 건너뛴다.
- 문제가 된 방화벽 규칙을 안전하게 지운다.
- 남은 옛 Google Cloud 방화벽 규칙 가운데 범위가 느슨하게 정해진 것이 있는지 모두 감사한다.
- GCP 지원을 유지하면서 AWS 를 더하고 리전마다 여러 metal 데이터 센터에 투자해, 여러 종류의 컴퓨트를 지원하는 복원력 있는 인프라를 만든다. AWS 는 지금 일부 고객과 시험하고 있다.
교훈
–
출처
관련 사례
같은 원인 · 공통 Terraform, VPC 라우팅 테이블과 방화벽 규칙
IL-0091Terraform 으로 노드 인스턴스 타입을 바꾸자 노드가 한꺼번에 교체되어 사용자 운영 파드가 모두 지워지고 서비스가 내려갔다UK Ministry of Justice · 2023같은 원인 · 공통 Terraform
IL-0109로그 수집을 고치려던 EKS 노드 롤오버가 꼬이면서 Auto Scaling 그룹이 정상 워커 노드를 모두 종료해 클러스터에 노드가 하나도 남지 않았다.DFDS · 2023 · sev1같은 원인 · 공통 Terraform
같은 원인 · 공통 Terraform
같은 원인 · 공통 Terraform
같은 원인 · 공통 Terraform
IL-0061Terraform 상태 파일이 리뷰 빌드에서 바뀐 데다 권한 차이까지 겹쳐 Terraform 이 운영 GKE 클러스터 세 개 중 두 개를 삭제했다Spotify · 2019같은 원인 · 공통 Terraform
같은 원인 · 공통 VPC 라우팅 테이블과 방화벽 규칙
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0355
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0355/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.