AWS ALB 502 Bad Gateway
정의 (Definition)
AWS ALB에서 HTTP 502 Bad Gateway는 로드 밸런서가 백엔드(Target)로부터 잘못된 형식의 응답을 받거나, 연결 수립/유지 과정에서 **TCP Reset(RST)이나 조기 종료(Premature Close)**가 발생했음을 의미합니다.
문제가 되는 배경 (Problem Context)
Node.js 애플리케이션 배포 시 가장 흔하게 겪는 오류입니다. “앱은 정상인데 왜 502가 뜨지?”라는 의문이 생기는데, 이는 주로 ALB와 Node.js 간의 Keep-Alive 타임아웃 불일치로 인한 “Race Condition” 때문입니다.
핵심 메커니즘 (How it Works)
- Keep-Alive Mismatch:
- ALB는 기본적으로 연결을 60초(Idle Timeout) 유지하려 합니다.
- Node.js(기본값)는 약 5초 후에 연결을 끊으려 합니다.
- ALB가 “살아있다”고 생각한 연결로 요청을 보낸 순간, Node.js가 연결을 끊어버리면(TCP RST/FIN), ALB는 이를 “Bad Gateway”로 처리합니다.
- Header Size Limit: 백엔드가 반환한 헤더가 32KB를 초과하면 ALB가 파싱하지 못하고 502를 뱉습니다.
불변 조건과 보장 범위 (Invariants & Guarantees)
- 보장: 502는 백엔드와의 “연결” 자체는 시도했으나, “대화”가 정상적으로 마무리되지 않았음을 의미합니다.
- 제약: ALB는 백엔드가 보낸 TCP RST 패킷을 클라이언트에게 전달할 수 없으므로, 대신 502 HTTP 응답을 생성합니다.
비유 (Analogy)
- 502 Error: “전화(ALB)를 걸었는데, 상대방(Node.js)이 여보세요? 하기도 전에 뚝 끊어버리거나(RST), 알아들을 수 없는 괴성(Malformed Response)을 지르는 상황”입니다.
실무적 함의 (Operational Implications)
- Timeout 튜닝: 반드시 Node.js
keepAliveTimeout> ALB Idle Timeout 공식(예: 61초 > 60초)을 지켜야 합니다. - OOM 감지: 애플리케이션이 OOM(Out of Memory)으로 급사할 때도, 열려있던 소켓이 OS에 의해 강제 회수되면서 502가 발생할 수 있습니다.
주의사항 / 오해 (Pitfalls & Misconceptions)
- “502는 서버 다운이다?”: 서버는 살아있지만 “네트워크 매너(Protocol)“가 안 맞아서 생기는 경우가 더 많습니다.
- “504와 같다?”: 502는 “즉각적인 거부/에러”이고, 504는 “무응답/지연”입니다. 성격이 다릅니다.
References
- AWS Docs: Troubleshoot HTTP 502 errors
- Node.js Docs: server.keepAliveTimeout