Skip to content

필사 모드: 유명 포스트모템 해부 — Cloudflare·Fastly·AWS·Knight Capital·GitLab의 실패에서 배우기

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

프롤로그 — "실패는 최고의 선생이다"

2025년 4월, 당신의 서비스가 오전 3시 다운됐다.

- 원인: 모름

- 복구: 2시간

- 책임자: 어젯밤 커밋한 누군가

- 분위기: "누가 그랬어?"

이것은 **Blame culture** — 실패에서 배울 수 없는 환경.

반대로, 세계적 기업들은 **Postmortem을 공개**한다. Cloudflare, Google, AWS, GitLab. "우리가 이렇게 망쳤고, 이렇게 배웠다"는 투명성은 **업계 전체**를 학습시킨다.

Season 3 Ep 1에서 회사들의 **성공** 아키텍처를 봤다면, Ep 2는 **실패**에서 배운다.

이 글은 공개된 postmortem에서 추출한 실전 교훈. 같은 실수를 **다른 사람 비용으로** 피하자.

1부 — Postmortem이란

정의

> **Postmortem** (사후 분석): 사건 발생 후 원인, 영향, 타임라인, 교훈을 문서화.

Google SRE 북의 5요소

1. Incident summary

2. Impact (누가, 얼마나)

3. Root cause (기술적 + 프로세스)

4. Timeline (분 단위)

5. Action items (구체적)

Blameless Postmortem 핵심

나쁜 예: "Alice가 잘못된 config push 했다"

좋은 예: "Config validation이 부재했다.

Alice의 change가 통과한 것은 시스템의 격차."

**철학**: 사람이 아닌 **시스템**을 고침. 비난하면 다음 사람이 숨김.

2부 — Cloudflare 2022-06-21 — BGP로 반이 다운

무슨 일

2022년 6월 21일 06:27 UTC

Cloudflare의 19개 데이터센터(세계 절반의 트래픽) 다운

1시간 30분 동안 고객 서비스 영향

원인

**BGP 경로 변경 중 실수**:

Cloudflare가 네트워크 표준화 중

일부 데이터센터에서 BGP configuration 롤아웃

Config 변경: 일부 prefix 광고 중단 → 트래픽 갈 곳 없음

왜 전체가?

중앙 control plane이 config 전파

여러 DC가 동시에 영향받는 구조

Canary 없이 빠른 전파

교훈

1. **Config change도 배포**: Canary 필수

2. **Central control의 양날**: 속도 vs 폭발 반경

3. **BGP은 위험**: 실수가 인터넷 단위

4. **투명한 포스트모템**: Cloudflare가 몇 시간 내 공개

Action items (Cloudflare 발표)

- Config 변경 workflow 재설계

- 더 강한 staging 환경

- Progressive rollout 강제

- Alert 개선

3부 — Cloudflare 2019-07-02 — 정규식이 CPU 100%

무슨 일

2019년 7월 2일

Cloudflare WAF rule 업데이트 → 전 세계 CPU 100%

27분 동안 HTTP 50x 증가

원인 — Catastrophic Backtracking

WAF rule에 있던 정규식:

(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|

`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*)))

"Catastrophic backtracking" 유발

일부 입력에서 지수 시간 실행

→ CPU 100% → HTTP 처리 불가

교훈

1. **Regex는 위험**: 복잡해지면 ReDoS 공격 가능

2. **WAF rule은 global change**: 한 수정이 전 세계

3. **CPU 테스트 필요**: Latency + throughput도

4. **Kill switch**: 문제 시 즉시 끄기

Cloudflare의 대응

- Re2 (Google) 같은 linear-time regex 엔진 검토

- WAF change에 CPU profiling

- Rolling deployment (한 번에 전 세계 X)

4부 — Fastly 2021-06-08 — 한 고객이 인터넷 반을 멈추다

무슨 일

2021년 6월 8일 10:00 UTC

Fastly CDN 전 세계 다운 (약 1시간)

영향: Amazon, Reddit, CNN, NYT, PayPal, UK 정부 웹사이트

"인터넷이 절반 멈췄다"고 보도

원인

한 고객이 특정 config 변경

이 config가 Fastly 내부의 softwarebug trigger

→ 전 세계 edge 서버 cache miss + 시스템 오류

→ 85% 트래픽 영향

5월부터 배포된 버그

5월 12일: 소프트웨어 배포 (bug 심어짐)

6월 8일: 특정 고객 config가 버그 trigger

→ 잠복했던 bug 폭발

교훈

1. **Multi-tenancy의 위험**: 한 고객이 모두에게 영향

2. **Dormant bugs**: 몇 주/몇 달 후 터짐

3. **Fast recovery**: Fastly 1시간 안에 복구 (인상적)

4. **고객 테스트 한계**: 실제 production mix 시뮬레이션 불가

5부 — AWS S3 2017-02-28 — 오타 하나가 인터넷을 멈추다

무슨 일

2017년 2월 28일 09:37 PST

AWS us-east-1 S3 다운 (약 4시간)

영향: Slack, Quora, Trello, Medium, 수천 사이트

AWS "Service Health Dashboard"도 S3 쓰기 때문에 못 업데이트

원인

엔지니어가 billing 시스템 디버깅:

S3 subsystem 서버 일부를 의도적으로 재시작할 계획

하지만 오타로 더 많은 서버를 재시작

구체적으로:

- Index subsystem + Placement subsystem 핵심 서버 삭제

- 이 subsystem은 S3 core

- 완전 재시작 필요 → 4시간

교훈

1. **인간의 실수는 불가피**: 도구로 방어해야

2. **Automation의 빈자리**: 파괴적 명령 확인 X

3. **Blast radius**: 모든 subsystem 같은 AZ

4. **Dashboard dependency**: Status page가 같은 시스템 의존

AWS의 대응

- Dangerous operations에 대한 safeguard 추가

- Command-line tool 개선 (--confirm 같은)

- Service 의존성 재설계

- Status page 독립

6부 — Knight Capital 2012-08-01 — 8분에 $440M 잃다

무슨 일

2012년 8월 1일 오전 9:30 (뉴욕 증시 개장)

Knight Capital(미국 주식 시장 주요 market maker)

8분 만에 $440M 손실

→ 회사 거의 파산, 3개월 후 매수

원인 — Dead Code Resurrection

배경:

- Knight의 거래 시스템에 수년 사용 안 한 "Power Peg" 기능

- Dead code로 남아 있음

- 새 기능 배포 중 8개 서버 중 1개에 배포 실수

- 이 서버가 "Power Peg" code를 re-enable flag로 해석

- 시장 개장과 함께 광적인 주문 생성 시작

8분 간:

- 수백만 주문 생성

- 가격에 무관하게 buy high, sell low

- 시장 왜곡

- 총 $440M 손실

교훈

1. **Dead code 제거**: 쓰지 않는 코드는 위험

2. **배포 자동화**: 수동 8개 서버 업데이트는 에러 온상

3. **Feature flag 재사용 금지**: 같은 flag를 다른 의미로 쓰면 재앙

4. **Circuit breaker**: 비정상 주문 자동 차단 X

5. **Testing gap**: Pre-production에서 문제 잡혔어야

7부 — GitLab 2017-01-31 — DB wipe

무슨 일

2017년 1월 31일 저녁

GitLab.com 데이터베이스 wipe

300GB 데이터 잃을 뻔 (복구 가능: 약 6시간 transaction 손실)

원인 — 인간 실수 + 백업 미작동

상황: DB replication 문제 디버깅

1차 DB에서 replication 꼬임

엔지니어가 replica 정리하려 함

실수 1: rm -rf를 잘못된 DB에 실행

→ Production DB 일부 삭제

복구 시도:

백업 1 (daily pg_dump): 오류로 파일 0 bytes

백업 2 (LVM snapshot): 6시간 전

백업 3 (S3 upload): 활성화 안 됨

백업 4 (replica): 문제의 원인이었던 그것

백업 5 (Azure 디스크 snapshot): 복구 가능

→ 결국 6시간치 transaction 손실

혁신적 대응

**Live-stream postmortem**: GitLab이 **YouTube로 실시간 복구 과정 공개**.

수만 명 시청. 투명성의 극치.

교훈

1. **백업은 테스트**: 안 복구해봤으면 백업 X

2. **여러 백업 종류**: 하나 실패해도 다른 것

3. **인간 실수 방지**: Destructive command는 double-check

4. **투명성**: GitLab 신뢰 오히려 증가

8부 — Facebook 2021-10-04 — BGP가 또 범인

무슨 일

2021년 10월 4일 15:40 UTC

Facebook, Instagram, WhatsApp 전 세계 6시간 다운

Facebook 직원도 건물 못 들어감 (badge 시스템도 의존)

원인

BGP config 변경 → Facebook의 DNS 서버가 internet에서 사라짐

내부 도구도 모두 internet 의존 → 엔지니어가 복구 못함

물리적 출입증도 영향 → 데이터센터 진입 불가

복구:

- 데이터센터에 물리적으로 진입

- 네트워크 장비 수동 리셋

- BGP 광고 복원

교훈

1. **Out-of-band access**: 주 네트워크 죽어도 들어갈 경로

2. **Dependency loop**: 모든 것을 Internet에 의존 시 self-lockout

3. **물리적 접근**: 디지털 인프라도 물리 공간 필요

4. **BGP의 위험**: 반복되는 패턴

9부 — Heroku 2021-04-13 — GitHub OAuth 토큰 유출

무슨 일

2021년 4월

Heroku의 GitHub OAuth integration 토큰 유출

공격자가 수천 Heroku 계정의 GitHub repos 접근

Heroku가 초기에 제대로 알리지 않아 신뢰 상실

교훈

1. **Secret 관리**: OAuth token도 secret

2. **Rotation**: 주기적 교체

3. **신속한 disclosure**: 숨기면 더 큰 위기

4. **Third-party risk**: 통합은 취약점 창구

10부 — Roblox 2021-10-28 — 73시간 다운

무슨 일

2021년 10월 28일부터 73시간 다운

5천만 DAU 게임 플랫폼

Black Friday 주말

원인

HashiCorp Consul (service discovery) 클러스터 서버 부하

새 기능이 Consul에 과도한 쓰기 부하 발생

Consul consensus 깨짐 → 전체 downtime

특별한 점

**HashiCorp + Roblox 공동 포스트모템**. 벤더와 고객이 함께 분석.

교훈

1. **Service discovery dependency**: 핵심은 극단적 안정

2. **Chaos testing**: 부하 테스트에서 잡았어야

3. **Vendor collaboration**: 책임 공유 모델

11부 — Atlassian 2022-04-05 — 14일 다운

무슨 일

2022년 4월

775 Atlassian 고객 (Jira, Confluence 등)

14일간 복구 중

스크립트 오류로 데이터 삭제

원인

legacy 기능 deprecation 스크립트

"사이트" 단위로 삭제해야 했는데 "앱" 단위로 잘못 인자

→ 고객 전체 사이트 데이터 삭제

복구: 백업에서, but 고객 데이터이므로 각각 수작업

교훈

1. **Destructive script는 dry-run 필수**

2. **Backup per tenant**: SaaS 멀티테넌시 복구 핵심

3. **Restore 속도**: 백업은 있어도 복구 느리면 의미 반감

4. **고객 communication**: Atlassian이 초기 대응 부실로 비난받음

12부 — 실패 패턴 10가지

모든 postmortem에서 보이는 패턴:

1. **수동 작업 + 실수** (Knight, AWS, GitLab)

2. **Config change without staging** (Cloudflare)

3. **Dead code / 사용 안 하는 기능** (Knight)

4. **Global rollout without canary** (Cloudflare, Fastly)

5. **BGP** (Facebook, Cloudflare)

6. **Backup 작동 안 함** (GitLab)

7. **Dependency loop** (Facebook, AWS S3 dashboard)

8. **Multi-tenant blast radius** (Fastly, Atlassian)

9. **Third-party integration risk** (Heroku)

10. **Chaos testing gap** (Roblox)

13부 — Postmortem 템플릿

실전 템플릿

Incident: [Title]

Date: 2026-04-15

Severity: SEV1/SEV2/SEV3

Duration: 09:30-11:45 UTC (2h 15m)

Impact: X users affected, Y revenue lost

Summary

[2-3 sentences]

Impact

- Users: ...

- Revenue: ...

- Services: ...

- Customer communications: ...

Timeline

- 09:30 UTC: Alert triggered

- 09:35 UTC: Engineer paged

- ...

Root Cause

[Technical explanation]

Contributing factors:

- ...

Detection

- How was it detected?

- Time to detect: X min

- Could it have been detected faster?

Response

- Time to mitigate: X min

- What worked?

- What didn't?

Recovery

[Steps taken to restore service]

Lessons Learned

What went well

- ...

What went wrong

- ...

Where we got lucky

- ...

Action Items

| Item | Owner | Priority | Due |

|---|---|---|---|

| Add canary deployment | @alice | P0 | 2026-04-30 |

| ... | | | |

Supporting Data

- Graphs, logs, screenshots

작성 팁

1. **사건 후 48시간 이내** 초안

2. **여러 사람 리뷰** (관련자 모두)

3. **Action item은 SMART** (Specific, Measurable, ...)

4. **Follow-up**: 2주, 4주 후 status 체크

5. **공개 고려**: 일부라도 외부 공유

14부 — 체크리스트 12개

- [ ] Postmortem 템플릿 팀에 도입

- [ ] Blameless 문화 명시 + 훈련

- [ ] Action item tracking (Jira/Linear)

- [ ] 2주/4주 follow-up 미팅

- [ ] 백업 복구 **실제** 테스트 (분기 1회)

- [ ] Chaos Engineering 시작 (간단한 것부터)

- [ ] Canary / Progressive rollout 강제

- [ ] Out-of-band access (건물/네트워크)

- [ ] Destructive command safeguard (--confirm)

- [ ] Dead code 정기 정리

- [ ] Incident response runbook

- [ ] Company-wide Game Day (연 1회)

15부 — 안티패턴 10가지

1. **누가 했는지 찾기** → 비난 문화

2. **Postmortem 공개 안 함** → 같은 팀이 같은 실수

3. **Action item 추적 X** → 종이 호랑이

4. **1시간 미팅으로 끝** → 깊이 없음

5. **Root cause를 하나로** → 복잡한 사건은 여러 원인

6. **"Just human error"** → 시스템 설계 문제 회피

7. **SEV1 아니면 postmortem X** → 작은 것에서 배움

8. **백업 있다고 안심** → 복구 테스트 안 함

9. **Chaos Engineering 미룸** → 프로덕션이 Chaos

10. **Legal/PR이 Postmortem 편집** → 진실 희석

마무리 — "실패는 비싸지만, 배움은 더 비싸지 않다"

Cloudflare, GitLab, AWS — 업계 톱들이 공개 postmortem으로 **업계 전체**를 가르친다.

그들이 잃은 것: 100M+ 달러.

우리가 얻는 것: 공짜 교훈.

다음번 당신의 서비스가 다운되면:

- 누구를 탓할 시간에 **시스템을 고쳐라**

- 부끄러워할 시간에 **문서화해라**

- 숨길 시간에 **팀과 공유해라**

**"실패에서 배울 수 있는 조직이 경쟁력"**. Google SRE 책이 25년 전부터 했던 말.

다음 글은 Season 3 Ep 3 — **스케일링 변곡점 완전 가이드**.

1 → 100 → 10K → 100K → 1M → 10M 사용자별 아키텍처 변화. 언제 DB 샤딩? 언제 Microservices? 언제 CDN? 구체적 임계점.

다음 글 예고 — "스케일링 변곡점 완전 가이드: 100 → 10K → 1M 사용자별 아키텍처 진화"

Season 3 Ep 3은:

- 100 users: 단일 서버, SQLite

- 10K users: Rails + Postgres + Redis

- 100K users: read replica, 캐시, CDN

- 1M users: read/write split, 샤딩

- 10M users: Microservices 검토

- 언제 언어 바꿀까?

- Real 회사들의 변곡점

다음 글에서.

현재 단락 (1/258)

2025년 4월, 당신의 서비스가 오전 3시 다운됐다.

작성 글자: 0원문 글자: 7,514작성 단락: 0/258