AWS EKS + ALB Ingress + Node.js 환경에서 HTTP 5xx 오류의 의미와 차이, 구체적인 원인과 해결 방법을 RFC 표준과 AWS 문서 기반으로 정리한다.
핵심 개념
503 — 타겟이 없다
503 Service Unavailable은 로드 밸런서가 요청을 전달할 유효한 타겟을 찾지 못했을 때 발생한다.
Kubernetes 환경에서 주요 원인:
타겟 없음: Service Selector가 Deployment 라벨과 불일치하여 Endpoints가 비어있는 경우.
타겟 비활성: Pod가 존재하지만 Readiness Probe를 통과하지 못해 ALB가 ‘Unhealthy’로 간주하는 경우.
Ingress 설정 오류: 존재하지 않는 Service나 잘못된 포트를 가리키는 경우.
sequenceDiagram
participant Client
participant ALB
participant TargetGroup
Client->>ALB: HTTP Request
ALB->>TargetGroup: Select Healthy Target
TargetGroup-->>ALB: No Healthy Targets Available
ALB-->>Client: 503 Service Unavailable
구분법: CloudWatch에서 HTTPCode_ELB_5XX 증가면 ALB 자체 문제, HTTPCode_Target_5XX 증가면 애플리케이션이 503을 반환한 것이다.
503 발생 시 가장 먼저 kubectl get endpoints <서비스명>을 확인한다. Endpoints가 비어있다면 Service Selector를 점검하고, 있는데 접근이 안 된다면 Pod의 Readiness Probe 설정을 확인한다.
502 — Node.js가 연결을 끊었다
502 Bad Gateway는 ALB가 백엔드로부터 유효하지 않은 응답을 받았을 때 발생한다.
가장 흔한 원인은 Keep-Alive Timeout 불일치다.
Node.js의 기본 keepAliveTimeout은 5초, AWS ALB의 기본 idle timeout은 60초.
ALB는 60초 동안 연결 유지를 기대하고 유휴 연결을 재사용하지만, Node.js는 5초 후 소켓을 끊어버린다.
ALB가 닫힌 소켓으로 요청을 보내다 실패하여 502 Bad Gateway를 반환한다.
sequenceDiagram
participant ALB
participant NodeJs as Node.js App
ALB->>NodeJs: TCP Connection Established
Note over ALB, NodeJs: Idle (No traffic)
NodeJs->>NodeJs: Keep-Alive Timeout (5s) Exceeded
NodeJs--xALB: Close Connection (TCP RST/FIN)
Note over ALB: Still thinks connection is open (Idle < 60s)
ALB->>NodeJs: Send New Request on Closed Socket
NodeJs-->>ALB: Connection Reset / Closed
ALB-->>Client: 502 Bad Gateway
Node.js의 keepAliveTimeout을 ALB Idle Timeout보다 길게 설정해야 한다: