확장성(Scalability) => 부하(트래픽)가 늘어날 때, 성능을 유지하기 위해 시스템 리소스를 늘릴 수 있는 능력
확장성의 2가지 종류
수직 확장(Vertical Scailability)
데이터베이스와 같이 분산되지 않은 시스템에서 흔히 사용
RDS, ElastiCache 등의 데이터베이스에서 쉽게 찾을 수 있음
구조는 그대로, “몸집만 키우는” 방식
장점: 구조가 단순하고 애플리케이션 코드를 거의 건드리지 않아도 됨
단점: 확장할 수 있는 정도에 한계가 있다
수평 확장(Horizontal Scailability = elasticity)
웹이나 현대적 애플리케이션은 대부분 분배 시스템
서버, 디스크, 네트워크, AZ… 뭐든 언제든 죽을 수 있음 그럼에도 불구하고 서비스는 계속 돌아가야 함
“한 개가 죽어도 다른 시스템이 대신 일하도록” 만드는 게 HA 설계
EC2
수직 확장 (인스턴스의 크기를 늘리는 것)
수평 확장(오토 스케일링 그룹 & 로드 밸런서에도 적용 가능한 개념)
고가용성

“트래픽 분배기 + 보안관 + 건강검진기” 역할을 함
트래픽 분배
뒤에 있는 여러 EC2 인스턴스(= Target/Backend)에게 나눠줌
Health Check (헬스 체크)
인스턴스 상태를 주기적으로 체크
죽어 있으면 그 서버로는 더 이상 트래픽 안 보냄 => 한 서버가 죽어도 서비스는 계속 동작 (고가용성)
스케일링과 궁합
Auto Scaling Group이 인스턴스를 늘리거나 줄이면,
로드 밸런서가 그 인스턴스들을 자동으로 붙였다 떼었다 하면서 트래픽 분배
단일 진입점 (Single Point of Access)
사용자는 로드 밸런서의 DNS 이름 하나만 알고 접속 => 사용자는 본인이 어떤 인스턴스에 연결되었는지 알 수 ❌
그 뒤에 서버가 몇 대든, 어떤 AZ에 있든 상관 없음
→ IP 바뀌는 개별 EC2 대신, 고정된 접점이 되어 줌
보안/암호화 처리 역할 → SSL 종료
클라이언트와 HTTPS 연결을 로드 밸런서에서 종료
= SSL/TLS Termination / Offloading
인증서를 로드 밸런서에서 관리하고,
백엔드에는 HTTP로 넘기거나 다시 HTTPS로 재암호화해서 넘김
효과:
개별 서버에서 TLS 설정/인증서 관리 안 해도 됨
암복호화 부담을 LB가 떠안아서 백엔드 부담↓
필요하다면 end-to-end 암호화도 구성 가능 (LB ↔ 백엔드도 HTTPS)
부하를 다수의 다운스트림 인스턴스로 분산하기 위해
하나의 액세스 포인트를 노출하기 위해
다운스트림 인스턴스의 오류를 핸들링하기 위해 & 헬스체크
SSL 종료를 제공
고정도를 만드는 방법은 여러 가지인데, 대표적으로:
Why❓
➡️ IP는 바뀔 수 있음
모바일, 4G/5G, 회사 프록시, NAT 뒤에 있을 때
여러 사용자가 같은 공인 IP를 공유하기도 함
반면 쿠키는 브라우저 단위로 저장됨
그 브라우저에서 오는 요청엔 항상 같은 쿠키가 딸려옴
→ 훨씬 “누가 누군지”를 안정적으로 구분 가능
“고정도(affinity)를 강화한다 = 한 사용자를 더 정확하게 같은 서버에 붙여준다”
Example)
예를 들어 ALB + EC2 구조에서:
사용자가 브라우저로 https://example.com 접속
로드 밸런서(ALB) 가 첫 요청을 서버 A로 보냄
이때 ALB가 특정 쿠키(예: AWSALB, AWSALBTG 같은 LB 쿠키) 를 응답에 실어 브라우저에 내려줄 수 있어
이후 요청에서 브라우저는 항상 그 쿠키를 붙여서 요청함
ALB는 쿠키를 보고 “아, 이 쿠키는 서버 A로 붙어 있던 애네?” 하고
→ 계속 서버 A로 라우팅
운영 부담 줄어드는 AWS 관리형 서비스
직접 로드 밸런서(Nginx, HAProxy, keepalived 등)를 구축하면:
설치, 설정, 패치, 모니터링, 장애 대응, 스케일링까지 전부 내가 해야 함
ELB는 fully managed:
OS, 소프트웨어 패치, 스케일링, 고가용성 설계 등을 AWS가 맡음
→ 운영(운영 인력·시간) 비용이 줄어든다
→ 시험 키워드: “undifferentiated heavy lifting을 AWS가 대신해준다”
실제 애플리케이션 레벨로 두드려 보는 것
포트
타겟 인스턴스(EC2 등)에서 어느 포트로 요청을 보낼 건지
EC2가 80포트에서 웹 서버 실행 중이면
=> Health Check Port = 80
앱 서버가 8080포트에서만 떠 있으면
=> Health Check Port = 8080
traffic port 로 하면
=> Target Group에 설정된 포트(예: 80, 443 등)를 그대로 따라감
그래서 “포트로 Health Check를 한다” =
“ELB가 각 타겟의 지정된 포트에 직접 접속해서 확인한다”는 뜻
라우트
특정 URL 경로(라우트)”로 GET을 날려 보고 응답 코드로 판별
예시:
Health check path: /
Health check path: /health
Health check path: /status
Health check path: /actuator/health (Spring Boot 같은 거)
http://타겟IP:포트/health
http://10.0.1.23:8080/health
응답값이 200~399 → Healthy / 500, 타임아웃 등 → Unhealthy
ALB(2016) -v2
NLB(2017) - v2
GWLB(Gateway Load Banlancer: 2020)

EC2의 Security Groups Rule은 포트 80 HTTP 트래픽 & 소스는 IP 범위가 아닌 LB의 SG가 된다.
→ EC2 인스턴스는 Load Balancer에서 온 트래픽만을 허용하게 되는 강화된 보안 메커니즘이 되는 것