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 판정 → 트래픽 차단 ✅

판단 기준