8,000달러를 낭비해 버린 1줄의 코드
(pietrasiak.com)- macOS용 화면 녹화 앱 Screen Studio의 자동 업데이트 버그로 인해, 250MB 파일이 5분마다 반복 다운로드되는 문제가 발생함
- 결과적으로 한 달간 2PB(2,000,000GB)의 트래픽이 Google Cloud에서 발생하며 약 $8,000의 요금 폭탄으로 이어짐
- 원인은 단순한 코드 누락으로, 업데이트 다운로드 후 반복 요청을 멈추는 로직을 빠뜨린 것임
- 일부 사용자에겐 인터넷 서비스 해지 등 실질적 피해까지 발생했고, 개발팀은 책임을 통감함
- 클라우드 비용 경고 설정, 비용 유발 코드 검토, 업데이트 서버 제어 장치 마련 등의 교훈을 강조함
사고 개요
- Screen Studio는 macOS용 데스크탑 화면 녹화 앱으로, 자동 업데이트 기능이 있음
- 업데이트 파일 용량은 약 250MB이며, 앱은 5분마다 서버를 확인함
- 버그로 인해 업데이트가 감지된 후에도 5분 간격 요청이 중단되지 않고 계속 다운로드됨
비극적 리팩터의 시작
- 기존에는 업데이트 팝업이 녹화 중 방해가 되어 UX 문제가 있었음
- 이를 개선하기 위한 리팩터 중, 업데이트 후 타이머를 정지하는 로직을 제거해버림
- 그 결과, 업데이트 파일이 반복 다운로드되는 로직이 앱 내에 내장된 상태가 됨
무서운 컨텍스트: 백그라운드 실행 상태
- 사용자 중 상당수가 앱을 수 주간 백그라운드 상태로 실행한 채로 사용 중이었음
- 이 상태에서 수천 개의 인스턴스가 5분마다 250MB를 자동 다운로드함
수치로 보는 재앙
- 5분마다 다운로드 = 하루 288회
- 사용자 1인당 일일 다운로드 트래픽 = 72GB
- 약 30일간 지속, 1천 명의 사용자 가정 시:
- 250MB × 288 × 30 × 1,000 = 약 2PB 트래픽
- Google Cloud에서 발생한 예상 요금: 약 $8,000
연쇄 실수들
- Google Cloud 비용 알림이 설정되지 않음
- 기존 월 요금 $300 수준으로 안일하게 생각
- 최종적으로는 신용카드 한도 초과로 거래가 차단되며 문제 인지
사용자 피해
- 한 사용자는 이 트래픽으로 인해 ISP(인터넷 제공업체)에서 서비스 계약 해지 통보를 받음
- 해당 지역에 대체 공급자 없음 → 심각한 생활 불편
- 팀은 책임 인정 및 비용 보상 제안, 다행히 상황은 원만히 해결됨
- 하지만 사용자에게 해를 끼친 경험은 개발자에게 깊은 반성을 남김
교훈 요약
- 클라우드 비용 알림은 필수
- 자동 업데이트 로직은 매우 신중하게 작성할 것
- 비용 유발 가능성이 있는 모든 코드는 특별히 검토할 것
- 서버 제어 신호(예: 강제 업데이트 플래그) 를 설계에 포함할 것
- 클라우드 사용 상태를 정기적으로 점검할 것
Hacker News 의견
-
미래에 웹 검색을 통해 이 스레드를 찾는 사람들을 위해: screen.studio는 macOS 화면 녹화 소프트웨어로, 5분마다 업데이트를 확인함. 그러나 이 게시물에서 설명된 버그는 5분마다 250MB의 업데이트 파일을 다운로드하는 것임
- 개발자들은 이 모든 것을 정상으로 간주하지만, 실제 다운로드로 인해 $8000의 대역폭 요금이 발생함
- 요약: 화면 녹화 소프트웨어가 5분마다 업데이트를 확인함. 이는 한 시간에 12번임
- 나는 개발자의 판단을 신뢰하는 정도에 따라 소프트웨어를 선택함. 이 판단이 합리적인지 고려해 보길 바람
-
Screen Studio는 macOS용 화면 녹화기임. 데스크톱 앱임. 최신 버전을 쉽게 설치할 수 있도록 자동 업데이트가 필요하다고 주장함
- 그러나 자동 업데이트는 여러 부정적인 결과를 초래함
- 사용자의 동의 없이 업데이트를 다운로드하여 클라이언트에 트래픽을 유발함
- 5분마다 반복적으로 다운로드가 계속됨. 사용자가 측정된 연결에 있는지 감지했는지 의문임
- 업데이트 팝업이 흐름을 방해하는 버그가 있음
- 팝업 자체가 사용자에게 나쁜 경험을 줌. 앱을 닫을 때 허용하고 나머지는 백그라운드에서 처리하는 것이 좋음
- 일부 사용자는 앱의 아웃고잉 연결을 주의 깊게 살피며, 5분마다 업데이트 확인은 과도함. 앱 실행 중에 할 필요가 없음. 시작 시 확인하고 종료 시 물어보는 것이 좋음
- 위의 모든 문제를 초래한 앱의 추가 복잡성. 개발자에게 비용이 발생함
- 앱 스토어가 이 경우 업데이트를 처리하는 완벽한 방법이 될 수 있음
-
화면 녹화기와 같은 중요하지 않은 앱의 개발자가 5분마다 업데이트를 확인해야 한다고 생각하는 것이 터무니없음
- 하루에 한 번이면 충분할 것임
-
정말로 5분마다 업데이트를 확인해야 하는지 의문임. 시작 시 한 번이면 충분하며, 사용자가 며칠 동안 켜두는 경우에도 하루에 한 번 또는 그보다 적게 확인할 수 있음
-
나는 코드 리뷰에 대해 항상 엄격함. 한 번은 매니저가 QA에 더 맡기라고 했을 때 "우리는 모두 직장을 잃을 수 있음. 우리는 항상 나쁜 코드 한 줄로 직장을 잃을 수 있음"이라고 대답함
- 주니어 또는 경험 많은 개발자가 잠재적인 PII 유출을 작성하는 경우가 많음. 대부분의 시스템에서 법적 문제를 일으킬 수 있는 가능성이 매우 큼
-
수천 명의 사용자가 데이터 요금제에서 불필요하게 소모한 대역폭에 대한 문제
- 이러한 부주의한 실수가 인터넷 사용자 모두에게 혼잡을 초래할 수 있음
- 만약 이 실수가 $8000의 비용이 아니라 Google Cloud의 무료 요금제나 다른 계획으로 해결되었다면, 여전히 심각한 버그로 간주하고 신속하게 수정했을지 의문임
- 얼마나 많은 잘못된 설계가 트래픽을 생성하고 공통 자원을 소모하고 있는지
-
내가 Mac 데스크톱 애플리케이션을 배포했을 때:
- 우리는 Sparkle을 사용하여 업데이트를 처리했음. 그들의 자체 업데이트를 선택한 것은 잘못된 선택이었음
- 우리의 애플리케이션은 매우 복잡했고 Mono와 함께 배포되었음. 그러나 10MB 정도였음. Windows 버전은 2MB였고 32비트 및 64비트 바이너리를 포함했음. 그들이 250MB의 화면 녹화기를 배포하는 이유가 궁금함
- 그들은 교훈을 얻지 못한 것 같음. 전체 기사는 그들을 어리석게 보이게 함
-
'더 나은 테스트'가 요약에서 언급되지 않은 것이 놀라움
- '코드를 신중하게 작성하라'는 제안이 초보적인 실수처럼 보임
- 개발자가 사용자 기기를 테스트 베드로 사용하는 것이 매우 좌절스러움
-
나는 서드파티 라이브러리 채택에 대해 보수적임 (각 라이브러리가 장기적으로 문제를 일으킬 가능성이 있기 때문임), 그러나 앱 업데이트는 가치가 있음
- 이는 기본적으로 하나의 큰 엣지 케이스이며, 앱에 심각한 버그가 있을 경우 복구 계획의 중요한 부분임
- 이 버그는 그들의 자체 업데이트의 유일한 문제가 아님. 5분마다 확인하는 것은 미친 짓임. 그들이 이에 대해 깊이 생각하지 않았다는 것을 보여줌
-
나는 Proxy Auto-Configuration (PAC) 파일을 사용하는 검열 방지 프록시 서비스를 운영 중임
- 파일에 잘못된 JS가 포함되어 있거나, 파일 크기가 1MB를 초과하면, 시스템 전체에 구성된 경우 모든 앱이 서버에 요청을 계속 보내는 문제가 발생함
- 이는 내 서버를 DDoS 공격하고 BGP 수준에서 IP를 차단하는 결과를 초래했음
- 500,000명 이상의 사용자가 매일 사용함. 내 웹 서버는 월 $20의 VPS로 무제한 트래픽을 제공함. 덕분에 나는 OP와 같은 상황에 처하지 않았음