ALB + Health Check 완벽 정리
전체 구조
인터넷
│
▼
[ALB] ← 리스너 (80, 443)
│
├── 규칙 1: /api/* → Target Group A
├── 규칙 2: /admin/* → Target Group B
└── 규칙 3: /* → Target Group C (default)
│
├── EC2-1 (healthy ✅)
├── EC2-2 (healthy ✅)
└── EC2-3 (unhealthy ❌ → 트래픽 차단)
1. ALB 구성 요소
Listener
포트 80 → HTTP 요청 수신
포트 443 → HTTPS 요청 수신
규칙 우선순위:
1순위: /api/* → Target Group API
2순위: /admin/* → Target Group Admin
999순위 (default): /* → Target Group Web
Target Group
타입: Instance / IP / Lambda
프로토콜: HTTP / HTTPS
포트: 앱이 듣는 포트 (예: 8080)
Target Group에 등록하는 방법
수동 등록: EC2 인스턴스 직접 추가
ASG 연동: ASG가 자동으로 등록/해제
→ 인스턴스 교체 시 자동 처리 ✅
2. Health Check 파라미터 완전 분석
Health Check 설정 항목:
Protocol: HTTP / HTTPS
Path: /ready (앱에서 구현한 경로)
Port: traffic-port (트래픽 포트와 동일)
또는 별도 지정 가능
Healthy threshold: 2 ← 연속 N회 성공 → Healthy
Unhealthy threshold: 2 ← 연속 N회 실패 → Unhealthy
Timeout: 5초 ← 이 안에 응답 없으면 실패 처리
Interval: 15초 ← 이 주기로 Health Check 실행
Success codes: 200 ← 이 상태코드만 성공으로 판단
타임라인 예시
Interval=15초, Unhealthy threshold=2, Timeout=5초
0초: Health Check → 응답 없음 (5초 대기) → 실패 1회
15초: Health Check → 응답 없음 (5초 대기) → 실패 2회
→ Unhealthy 판정 → 트래픽 차단
30초: Health Check → 200 OK → 성공 1회
45초: Health Check → 200 OK → 성공 2회
→ Healthy 판정 → 트래픽 재인입
장애 감지까지: 최대 (Interval × Unhealthy threshold) = 30초
복구 인정까지: 최대 (Interval × Healthy threshold) = 30초
3. /health vs /ready 차이
# /health → 프로세스 살아있나만 확인
@app.route('/health')
def health():
return {"status": "healthy"}, 200
# DB 연결 안 돼도 200 반환
# → ALB Health Check에 쓰면 안 됨 ❌
# /ready → 실제 서비스 가능한 상태인지 확인
@app.route('/ready')
def ready():
try:
conn = get_db_connection()
conn.execute("SELECT 1")
conn.close()
return {"status": "ready", "database": "connected"}, 200
except Exception as e:
return {"status": "not ready", "error": str(e)}, 500
# DB 연결 실패 시 500 반환
# → ALB가 Unhealthy 판정 → 트래픽 차단 ✅
판단 기준