ALB vs NLB: 로드 밸런서 선택 기준
AWS에서 로드 밸런서를 고를 때 실제 선택지는 둘입니다. Application Load Balancer(ALB)와 Network Load Balancer(NLB)입니다. 결론을 먼저 적으면, HTTP(S) 서비스는 ALB가 기본값이고, 고정 IP·비HTTP 프로토콜·PrivateLink가 필요할 때 NLB로 갑니다. 기능이 겹치는 영역이 있어 헷갈리지만, 갈리는 조건은 몇 개로 좁혀집니다. 두 로드 밸런서와 ACM 인증서 연결의 기초는 AWS 중급 #6에서 다뤘습니다. 요금은 us-east-1 기준입니다.
한눈에 보는 비교 #
| 구분 | ALB | NLB |
|---|---|---|
| 동작 계층 | L7 (HTTP/HTTPS, gRPC) | L4 (TCP/UDP/TLS) |
| 라우팅 | 경로·호스트·헤더 기반 규칙 | 없음 (리스너 포트 → 대상 그룹) |
| 고정 IP | 불가 (DNS 이름만) | AZ당 고정 IP, EIP 지정 가능 |
| 소스 IP | X-Forwarded-For 헤더로 전달 | 패킷 그대로 보존 |
| 대상 타입 | 인스턴스, IP, Lambda | 인스턴스, IP, ALB |
| 시간당 요금 | 약 $0.0225 | 약 $0.0225 |
| 용량 단위 | LCU당 약 $0.008 | NLCU당 약 $0.006 |
L7 vs L4: 요청을 읽는가, 흘려보내는가 #
ALB는 요청 내용을 읽고 판단하는 로드 밸런서입니다. 경로(/api/*), 호스트(admin.example.com), 헤더, 쿼리 스트링을 보고 서로 다른 대상 그룹으로 보냅니다. HTTP 리다이렉트와 고정 응답을 로드 밸런서 단에서 처리하고, Cognito·OIDC 인증을 붙여 백엔드 앞에서 로그인을 강제할 수 있으며, WAF를 직접 연결합니다. HTTP/2와 gRPC, WebSocket을 지원하고 Lambda를 대상으로 둘 수도 있습니다. 마이크로서비스 여러 개를 로드 밸런서 하나로 받는 구성이 ALB의 주 무대입니다.
NLB는 패킷을 열어 보지 않고 흘려보내는 로드 밸런서입니다. 라우팅 규칙이 없는 대신 처리 경로가 짧아 지연이 밀리초 미만 수준으로 낮고, 초당 수백만 요청과 갑작스러운 트래픽 스파이크를 워밍업 없이 받아냅니다. TCP·UDP·TLS 리스너를 지원하므로 게임 서버, MQTT 브로커, DNS, 데이터베이스 프록시처럼 HTTP가 아닌 트래픽은 애초에 NLB만 선택지입니다.
NLB에서만 되는 것 #
- 고정 IP: NLB는 AZ당 IP가 고정되고 EIP를 직접 지정할 수 있습니다. 방화벽 허용 목록에 IP를 등록해야 하는 기업 연동에서는 이 조건 하나로 NLB가 확정됩니다. ALB는 DNS 이름만 제공하고 IP가 수시로 바뀝니다.
- 소스 IP 보존: NLB는 클라이언트 IP가 패킷에 그대로 남습니다. ALB 뒤에서는 애플리케이션이 X-Forwarded-For 헤더를 읽도록 고쳐야 합니다.
- PrivateLink: VPC 엔드포인트 서비스로 다른 계정에 서비스를 노출하려면 NLB가 필수입니다. ALB는 단독으로 PrivateLink의 진입점이 될 수 없습니다.
- TLS 패스스루: 암호화를 백엔드까지 끝까지 유지해야 하는 요구(엔드 투 엔드 암호화 감사 등)는 TCP 리스너로 통과시키는 NLB만 가능합니다. 물론 NLB도 ACM 인증서로 TLS를 종료할 수 있습니다.
반대 방향의 오해도 정리해 둘 필요가 있습니다. 보안 그룹은 예전에는 ALB만 지원했지만 2023년부터 NLB에도 붙일 수 있어 이제 차별점이 아닙니다. 헬스 체크는 둘 다 지원하며, NLB는 TCP 헬스 체크(포트 열림 확인)도 됩니다.
요금: 시간당은 같고 LCU에서 갈립니다 #
둘 다 시간당 약 $0.0225로, 트래픽이 없어도 월 약 $16이 나갑니다. 차이는 용량 단위 요금입니다. ALB는 LCU당 약 $0.008, NLB는 NLCU당 약 $0.006인데, 단가보다 중요한 것은 한 단위가 담는 용량입니다.
- LCU(ALB) 1개: 신규 연결 초당 25개, 활성 연결 3,000개, 처리량 시간당 1GB, 룰 평가 초당 1,000개 중 가장 많이 쓴 차원으로 과금
- NLCU(NLB, TCP 기준) 1개: 신규 연결 초당 800개, 활성 연결 100,000개, 처리량 시간당 1GB
신규 연결 기준으로 NLCU 하나가 LCU의 32배를 담습니다. 연결이 많고 짧은 워크로드(폴링 클라이언트, IoT 디바이스 수만 대)는 같은 트래픽에 NLB 청구서가 크게 작아집니다. 반면 연결 수는 적고 대역폭 위주라면 두 쪽 다 처리량 차원(시간당 1GB)에 걸리므로 차이가 미미합니다. 어느 차원에 걸리는지는 CloudWatch의 ConsumedLCUs 지표로 확인합니다.
숨은 비용은 크로스존 로드 밸런싱입니다. ALB는 기본 활성이고 AZ 간 전송 요금이 없지만, NLB는 기본 비활성이며 켜면 AZ 간 데이터 전송 요금이 붙습니다. NLB로 옮기며 무심코 켜면 요금이 갑자기 늘어나는 항목이 됩니다. ALB 쪽 함정은 유휴 타임아웃(기본 60초)으로, 오래 걸리는 응답이나 롱 폴링은 타임아웃을 늘리지 않으면 504로 끊깁니다.
둘 다 필요하면: NLB → ALB 체인 #
고정 IP는 필요한데 경로 라우팅도 쓰고 싶다면 고르지 않아도 됩니다. NLB의 대상 타입에 ALB를 지정해 NLB(고정 IP·PrivateLink) → ALB(L7 라우팅) → 서비스 체인을 만들 수 있습니다. 로드 밸런서 두 개 값이 나가므로 어디까지나 두 요구가 실제로 동시에 있을 때의 구성이고, 한쪽 요구가 없으면 하나로 끝내는 것이 맞습니다.
선택 순서 #
- 프로토콜부터 봅니다: HTTP(S)·gRPC가 아니면 NLB로 확정입니다. TCP, UDP, TLS 패스스루는 ALB가 처리하지 못합니다.
- 고정 IP와 PrivateLink 요구를 확인합니다: 허용 목록 등록, VPC 엔드포인트 서비스 노출 중 하나라도 있으면 NLB입니다.
- L7 기능 필요 여부를 봅니다: 경로·호스트 라우팅, 인증 연동, WAF, Lambda 대상이 필요하면 ALB입니다. 컨테이너 서비스 여러 개를 한 진입점으로 받는 구성(ECS Fargate vs EC2에서 다룬 서비스 앞단)이 전형입니다.
- 둘 다면 체인을 검토합니다: NLB → ALB 구성으로 두 요구를 같이 충족할 수 있습니다.
- 요금은 LCU 차원으로 검산합니다: 연결 헤비면 NLB가 싸고, 대역폭 위주면 비슷합니다. 시간당 고정비는 같으므로 상시 점검 목록에 안 쓰는 로드 밸런서가 남아 있지 않은지도 같이 봅니다.
정리 #
- HTTP(S) 서비스는 ALB가 기본값입니다. 경로·호스트 라우팅, 인증, WAF, Lambda 대상까지 L7 기능은 전부 ALB 쪽입니다.
- 고정 IP, 소스 IP 보존, PrivateLink, TLS 패스스루, 비HTTP 프로토콜 중 하나라도 걸리면 NLB입니다.
- 시간당 요금은 둘 다 약 $0.0225로 같고, 청구서는 LCU 계산에서 갈립니다. 신규 연결 용량이 32배 차이라 연결 헤비 워크로드는 NLB가 유리합니다.
- NLB의 크로스존 로드 밸런싱은 기본 꺼져 있고 켜면 AZ 간 전송 요금이 붙습니다. ALB는 유휴 타임아웃 60초가 기본입니다.
- 고정 IP와 L7 라우팅이 동시에 필요하면 NLB → ALB 체인으로 구성합니다.