[AWS] ALB vs NLB: L7 vs L4 로드 밸런서
AWS ALB NLB, ALB, NLB, Application Load Balancer, Network Load Balancer, AWS Load Balancer, ELB
정의
| ALB | NLB | (Classic ELB) | |
|---|---|---|---|
| Layer | L7 (HTTP) | L4 (TCP/UDP) | L4 + L7 (legacy) |
| 라우팅 | path / host / header | port | 단순 |
| TLS termination | O | O (TLS listener) | O |
| WebSocket | O | O | 부분 |
| gRPC | O | O | X |
| 처리량 | 큼 | 매우 큼 | 보통 |
| Static IP | NO | 예 (EIP) | NO |
| Latency | 중간 (ms) | 극저지연 (us) | 중간 |
| 가격 | LCU (요청 + 데이터) | LCU | 시간 + GB |
사용 상황
| 상황 | 선택 |
|---|---|
| HTTP/HTTPS 마이크로서비스 라우팅 | ALB |
| path/host 기반 분기 (microservices) | ALB |
| WAF, Cognito OIDC 인증 앞단 | ALB |
| Lambda 직접 호출 | ALB |
| 극저지연 TCP 트래픽 (게임, 금융) | NLB |
| static IP 필요 (방화벽 화이트리스트) | NLB |
| AWS PrivateLink 엔드포인트 | NLB |
| 수백만 동시 연결 | NLB |
ALB (Application Load Balancer)
flowchart LR
Client -->|HTTP| ALB
ALB -->|"/api/*"| Tg1["Target Group 1<br/>(api pods)"]
ALB -->|"/web/*"| Tg2["Target Group 2<br/>(web pods)"]
ALB -->|"host: admin.x.com"| Tg3["Target Group 3<br/>(admin)"]
기능:
- Path-based / Host-based / Header / Query routing
- WebSocket / HTTP/2 (gRPC)
- WAF 통합
- Cognito / OIDC 인증 (앞단)
- Lambda 직접 target
- IP 또는 instance target
NLB (Network Load Balancer)
flowchart LR
Client -->|TCP/UDP| NLB["NLB<br/>(static IP, AZ 별)"]
NLB --> Tg[Target Group]
Tg --> EC2[(EC2 / IP)]
기능:
- 극저지연: 마이크로초.
- static IP: AZ 별 EIP 고정 (방화벽 허용 친화).
- millions of conn.
- TLS termination 옵션.
- TCP / UDP / TLS listener.
IMPORTANT
gRPC, WebSocket idle 대응 은 NLB 가 ALB 보다 안정. 정 idle timeout 길게.
선택 트리
flowchart TD
Q1{프로토콜}
Q1 -->|HTTP / HTTPS / gRPC| Q2{L7 라우팅 필요?}
Q1 -->|TCP / UDP| NLB[NLB]
Q2 -->|예| ALB[ALB]
Q2 -->|아니오 + 극저지연| NLB
Q2 -->|아니오 + 일반| ALB
Target Group
TargetType: instance | ip | lambda
HealthCheck:
Protocol: HTTP
Path: /health
Interval: 30s
HealthyThreshold: 2
UnhealthyThreshold: 3
Target group을 서비스별로 분리하면 ALB 하나로 멀티 서비스 라우팅 가능.
ALB Listener 규칙 우선순위
규칙은 1~50000 우선순위로 평가. 낮을수록 먼저.
# 규칙 추가 예시
aws elbv2 create-rule \
--listener-arn arn:aws:elasticloadbalancing:...:listener/... \
--priority 10 \
--conditions '[{"Field":"path-pattern","Values":["/api/*"]}]' \
--actions '[{"Type":"forward","TargetGroupArn":"arn:..."}]'
| 조건 (Field) | 예시 |
|---|---|
path-pattern | /api/*, /static/* |
host-header | api.example.com |
http-header | X-Custom-Header: value |
source-ip | 10.0.0.0/8 |
query-string | env=canary |
HTTPS / TLS 설정
# HTTPS Listener 생성
aws elbv2 create-listener \
--load-balancer-arn arn:... \
--protocol HTTPS --port 443 \
--certificates CertificateArn=arn:aws:acm:...:certificate/... \
--ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06 \
--default-actions Type=forward,TargetGroupArn=arn:...
# HTTP → HTTPS redirect
aws elbv2 create-listener \
--load-balancer-arn arn:... \
--protocol HTTP --port 80 \
--default-actions \
Type=redirect,RedirectConfig='{Protocol=HTTPS,StatusCode=HTTP_301}'
TIP
SSL Policy 는 최소 ELBSecurityPolicy-TLS13-1-2-2021-06 권장. TLS 1.0/1.1 비활성.
Sticky Session
Stickiness:
Type: lb_cookie # ALB 가 쿠키 박음
Duration: 1d
또는 application-controlled (app 이 cookie 박음).
세션 sticky는 stateful 앱에서만. 가능하면 stateless 설계 권장.
WAF 통합 (ALB 만)
flowchart LR
Client --> WAF[AWS WAF]
WAF --> ALB
ALB --> Target
Note[ALB 앞단 WAF: SQLi, XSS, rate limit, bot]
ALB → Lambda
TargetType: lambda
Targets:
- { Id: arn:aws:lambda:us-east-1:123:function:myFunc }
API Gateway 대신 ALB + Lambda 도 가능. 더 cheap, REST API 만.
NLB + PrivateLink
NLB를 VPC Endpoint Service 로 노출. 다른 VPC/계정에서 프라이빗 접근.
flowchart LR
ConsumerVPC["Consumer VPC"] -->|"VPC Endpoint"| PrivateLink["AWS PrivateLink"]
PrivateLink --> NLB
NLB --> ServiceVPC["Service VPC (Provider)"]
# Endpoint Service 생성 (NLB 기반)
aws ec2 create-vpc-endpoint-service-configuration \
--network-load-balancer-arns arn:aws:elasticloadbalancing:...:loadbalancer/net/...
SaaS 서비스가 고객 VPC에 안전하게 서비스 제공 시 표준 패턴.
Cross-Zone Load Balancing
기본값:
- ALB: 활성화
- NLB: 비활성화 (AZ 내 균등 분산)
# NLB cross-zone 활성화
aws elbv2 modify-load-balancer-attributes \
--load-balancer-arn arn:... \
--attributes Key=load_balancing.cross_zone.enabled,Value=true
NLB cross-zone 활성화 시 AZ 간 데이터 전송 비용 발생.
Connection Draining (Deregistration Delay)
Target 제거 전 기존 연결을 안전하게 종료.
aws elbv2 modify-target-group-attributes \
--target-group-arn arn:... \
--attributes Key=deregistration_delay.timeout_seconds,Value=30
기본 300초. 빠른 배포 환경에서는 30-60초로 줄이기.
Access Log
# Access Log 활성화 (S3)
aws elbv2 modify-load-balancer-attributes \
--load-balancer-arn arn:... \
--attributes \
Key=access_logs.s3.enabled,Value=true \
Key=access_logs.s3.bucket,Value=my-alb-logs \
Key=access_logs.s3.prefix,Value=alb
로그 필드: time, elb, client:port, target:port, request, target_status_code, user_agent.
Athena로 분석:
SELECT client_ip, request_url, target_status_code, COUNT(*) as cnt
FROM alb_logs
WHERE time > '2026-07-16'
GROUP BY 1, 2, 3
ORDER BY cnt DESC
LIMIT 100;
CloudWatch 핵심 메트릭
| 메트릭 | 의미 |
|---|---|
RequestCount | 총 요청 수 |
TargetResponseTime | 백엔드 응답 시간 |
HTTPCode_Target_5XX_Count | 백엔드 5xx 에러 |
HTTPCode_ELB_5XX_Count | ALB 자체 5xx |
HealthyHostCount | 헬시 타겟 수 |
UnHealthyHostCount | 비헬시 타겟 수 |
UnHealthyHostCount > 0알림 필수. 배포 중 타겟이 줄어들면 즉각 탐지.
흔한 함정
WARNING
- ALB Idle Timeout 60s = WebSocket / SSE 가 silent close. ping/pong 또는 timeout 늘림.
- NLB + auto-scaling = NLB 의 target deregistration delay. 트래픽 차단 후 수십 초 까지 일부 요청.
- HTTP/2 → 백엔드는 HTTP/1.1 = ALB 가 down-grade. gRPC backend 는 NLB 또는 HTTP/2 enable.
- NLB cross-zone disabled = AZ 간 불균등 분포. enable 권장 (가격 약간 더).
- ALB 규칙 한도 = Listener당 규칙 100개 제한. path 패턴 조합 주의.
- Health Check 경로 인증 =
/health에 인증 걸면 ALB가 401 받아 unhealthy 판정. 인증 제외. - NLB 의 Source IP 보존 = NLB는 기본적으로 클라이언트 IP 보존. ALB는 X-Forwarded-For 헤더.
관련 위키
이 글의 용어 (8개)
- [AWS] CloudFront: CDN, origin, behavior, signed URLcloud
- 정의 CloudFront = AWS 의 글로벌 CDN. 전세계 600 PoP (Points of Presence) 에서 사용자에게 가까운 edge 로 콘텐츠 제공. 지연 감소 +…
- [AWS] ECS (Elastic Container Service)cloud
- 정의 Amazon Elastic Container Service (ECS) 는 AWS 가 관리하는 컨테이너 오케스트레이터 입니다. Task definition (컨테이너 스펙) …
- [AWS] Route 53cloud
- 정의 Amazon Route 53 는 AWS 의 highly available, scalable Domain Name System (DNS) 웹 서비스 입니다. 이름은 DNS 표…
- [AWS] VPC: subnet, route, NAT, peeringcloud
- 정의 VPC (Virtual Private Cloud) = AWS 안의 논리적 격리 네트워크. CIDR 정의 + subnet 분할 + 라우팅. AWS 리소스를 격리된 네트워크에 …
- [AWS] WAF (Web Application Firewall)cloud
- 정의 AWS WAF (Web Application Firewall) 는 HTTP/HTTPS 요청을 검사하는 Layer 7 방화벽 서비스입니다. CloudFront, ALB, AP…
- [K8s] Ingress: L7 라우팅, TLS termination, Gateway APIkubernetes
- 정의 Ingress = 클러스터 외부 HTTP/HTTPS 트래픽 → 내부 Service 라우팅. L7 LB 역할. Service 의 LoadBalancer 다수 대안. [!IMP…
- [K8s] Service: ClusterIP / NodePort / LoadBalancer / ExternalNamekubernetes
- 정의 Service = Pod 집합에 안정 가상 IP + DNS 부여. Pod 가 죽고 다시 만들어져도 Service IP 는 그대로. 4가지 타입 1. ClusterIP (기본…
- [Network] Load Balancer: L4 vs L7, 알고리즘, sticky sessionnetwork
- 정의 Load Balancer 는 트래픽을 여러 백엔드로 분산 하는 인프라. 수평 확장 + 가용성 + 무중단 배포 의 토대. L4 vs L7 | 구분 | L4 (Transport…
이 개념을 다룬 위키 페이지 (16)
- wiki[AWS] API Gateway: REST/HTTP/WebSocket API 관리
- wiki[AWS] Auto Scaling: EC2 ASG, target tracking, predictive
- wiki[AWS] CloudFront: CDN, origin, behavior, signed URL
- wiki[AWS] ECS (Elastic Container Service)
- wiki[AWS] ECS + Fargate: 컨테이너 오케스트레이션
- wiki[AWS] Global Accelerator
- wiki[AWS] PrivateLink (VPC Interface Endpoints)
- wiki[AWS] RDS Multi-AZ + Read Replica
- wiki[AWS] Route 53
- wiki[AWS] Security Group vs NACL: stateful vs stateless 방화벽
- wiki[AWS] Shield (DDoS Protection)
- wiki[AWS] VPC: subnet, route, NAT, peering
- wiki[AWS] WAF (Web Application Firewall)
- wiki[FastAPI] Deployment (Uvicorn, Gunicorn, Docker)
- wiki[Flask] Deployment (WSGI, Gunicorn, uWSGI, Docker)
- wiki[Network] Load Balancer: L4 vs L7, 알고리즘, sticky session
💬 댓글