①편에서 만든 웹 서버 3대 앞에 ALB를 세웁니다. ALB가 요청을 3대에 고루 나눠주고(부하분산), 더 나아가 URL 경로에 따라 다른 서버로 보내는 똑똑한 라우팅까지 해봅니다.
먼저, ALB란
💡 ALB(Application Load Balancer) — HTTP/HTTPS(웹) 트래픽을 다루는 로드밸런서. 응용 계층(L7) 에서 동작해, 요청의 URL 경로·HTTP 헤더·호스트명 같은 "내용"을 보고 어디로 보낼지 결정할 수 있습니다. (단순히 IP/포트만 보는 게 아님)
이번 편 한눈에
단계 내용
ALB 생성
대상 그룹 → 로드밸런서 → 3대 분산 확인
경로 라우팅
/dev/*→서버1, /mgt/*→서버2·3
헤더 라우팅
User-Agent가 스마트폰이면 차단
V. ALB 생성
01~02. 대상 그룹(Target Group) 생성 + 대상 등록
>> 대상 유형 : 인스턴스
>> 대상 그룹 이름 : ALB-TG
>> VPC :ELB-vpc
>> 사용 가능한 인스턴스 >> 모든 인스턴스(선택)
>> 아래에 보류 중인 것으로 포함(클릭)
생성 진행
EC2 → 로드 밸런싱 → 대상 그룹 → 대상 그룹 생성.
대상 유형: 인스턴스
대상 그룹 이름: ALB-TG
VPC: ELB-VPC → 다음
2단계 대상 등록: 모든 인스턴스(3대) 선택 → "아래에 보류 중인 것으로 포함" → 다음 → 대상 그룹 생성
🖼️ [이미지] 대상 그룹 생성(ALB-TG) / 인스턴스 3대 등록
💡 대상 그룹(Target Group) — 로드밸런서가 트래픽을 보낼 대상(서버)들의 묶음. 로드밸런서는 직접 서버를 가리키지 않고, "이 대상 그룹으로 보내" 라고 합니다. 그룹 안의 서버들에 분산됩니다.
💡 상태 검사(Health Check) — 대상 그룹은 각 서버가 살아있는지 주기적으로 확인(기본 HTTP 80). 건강한 서버에만 트래픽을 보냅니다. (죽은 서버는 자동 제외)
💡 "보류 중(pending)" — 방금 등록한 대상이 상태 검사를 통과하기 전 임시 상태. 잠시 후 healthy 가 됩니다.
03. 로드밸런서 생성
>> 로드 밸런서 유형 : Application Load Balancer(선택)
>> 로드 밸런서 이름 : ALB
>> VPC : ELB-vpc
>> 가용 영역 및 서브넷 :
>> ap-northeast-2a
>> ap-northeast-2c
>> 보안 그룹 : ELB-Web-SSH-SG
>> 상태 : 프로비저닝중
>> 상태 : 활성
EC2 → 로드 밸런싱 → 로드밸런서 → 로드 밸런서 생성 → Application Load Balancer 생성.
이름: ALB
VPC: ELB-VPC
가용 영역 및 서브넷: 모두 선택 (2a·2c 둘 다)
보안 그룹: default 제거 → ELB-Web-SSH-SG 추가
리스너: 대상 그룹 ALB-TG 선택 → 로드 밸런서 생성
상태: 프로비저닝 중 → 활성
🖼️ [이미지] ALB 생성(VPC·서브넷 모두·SG·대상그룹) / 프로비저닝 중 → 활성
💡 리스너(Listener) — 로드밸런서가 어떤 포트로 들어오는 요청을 받을지 정한 "귀". 여기선 HTTP 80으로 듣고, 그 요청을 ALB-TG로 넘깁니다.
💡 가용 영역 모두 선택 — ALB를 여러 AZ에 걸쳐 배치해야, 한 AZ가 죽어도 동작하고 양쪽 AZ의 서버로 분산할 수 있습니다.
💡 프로비저닝(Provisioning) — AWS가 로드밸런서 자원을 준비·배치하는 중이라는 뜻. 끝나면 활성(Active).
ALB 동작 확인 (Client-EC2 터미널에서)
# ALB의 DNS 이름을 변수에 저장 (각자 본인 ALB 주소로)
ALB=ALB-2015228390.ap-northeast-2.elb.amazonaws.com
echo $ALB
# DNS 질의: 이 도메인이 어떤 IP인지 확인
dig $ALB +short
# 한 번 접속
curl $ALB
# 20번 반복 접속 후, 응답을 모아 개수 세기
for i in {1..20}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr
# 90번 반복
for i in {1..90}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr
명령 풀이
💡 DNS 이름 — ALB는 고정 IP 대신 도메인 이름으로 접속합니다(IP가 자동으로 바뀌므로). 그래서 변수 ALB에 그 이름을 담아 씁니다.
💡dig $ALB +short : 그 도메인이 가리키는 IP들을 조회. ALB는 보통 AZ마다 IP가 하나씩 나옵니다.
💡curl $ALB : 웹 요청을 보냄 → 응답으로 "Web Server-1/2/3" 중 하나가 옴.
💡for ... | sort | uniq -c | sort -nr : 여러 번 접속한 응답을 모아 같은 것끼리 개수를 셈. 결과를 보면 Server-1/2/3가 고루 나뉘는 걸 확인할 수 있습니다 → 부하분산 동작!
💡 교차 영역 로드밸런싱(Cross-Zone Load Balancing) — ALB는 기본으로 다른 AZ의 서버까지 고르게 분산합니다. 그래서 2a(서버1)·2c(서버2·3) 가릴 것 없이 3대에 골고루 갑니다.
ALB가 실제로 파악하는 것
ALB는 서브넷 개수를 세지 않습니다. 대신:
대상 그룹에 등록된 대상(서버) 목록을 알고 있습니다.
각 대상의 상태 검사(Health Check) 결과 — 살아있는지(healthy/unhealthy)를 주기적으로 확인합니다.
건강한(healthy) 대상에게만 트래픽을 보냅니다. 죽은 서버는 자동으로 분배 대상에서 빠집니다.
즉 "서브넷에 서버가 몇 개"가 아니라 "이 대상 그룹에 건강한 서버가 누구누구" 를 추적합니다. 그 결과 실질적으로 살아있는 서버 수만큼 균형 분배가 되는 게 맞습니다.
분배 방식 (알고리즘)
ALB 기본은 라운드 로빈(round robin) 입니다 — 새 요청이 올 때마다 건강한 대상에 차례대로 돌려가며 보냅니다. (옵션으로 "최소 미해결 요청" 방식도 있음) 그래서 결과적으로 각 서버에 고르게 나뉩니다.
교차 영역 로드밸런싱이 바로 이 "균형"을 결정합니다 — 우리 실습으로 보면:
서버는 az-2a에 1대(Server1), az-2c에 2대(Server2·3), 총 3대입니다.
교차 영역 ON (ALB 기본): 3대를 하나의 풀로 보고 분배 → 각 서버 ≈ 33%씩. AZ에 몇 대가 있든 상관없이 서버 단위로 균등.
교차 영역 OFF (가정): ALB 노드가 자기 AZ 서버에만 보냄. 트래픽이 두 AZ 노드에 ~50:50으로 들어오면 → 2a의 Server1이 혼자 50%, 2c의 Server2·3이 25%씩. AZ마다 서버 수가 다르면 불균형해집니다.
그래서 교차 영역 LB의 의미 = "AZ별 서버 수가 달라도, 전체 서버에 고르게 분배되게 한다" 입니다. ALB는 이걸 기본으로 켜둡니다.
- /dev/를 요청해도 서버2·3으로 가면 404 에러(거기엔 /dev가 없으니까) - /mgt/를 요청해도 서버1로 가면 404 에러
즉 "특정 경로는 특정 서버로 보내야" 합니다. 이게 경로 기반 라우팅의 필요성입니다. → 다음 단계에서 해결.
VI. ALB 경로 기반 라우팅
핵심 아이디어: URL 경로별로 다른 대상 그룹을 만들고, ALB 규칙으로 "이 경로는 이 그룹으로" 보냅니다.
01~02. 대상 그룹 두 개 더 만들기
DEV-TG: 대상 = Web-Server1만 (인스턴스 / ELB-VPC)
MGT-TG: 대상 = Web-Server2, Web-Server3
대상그룹 생성
>> 대상 유형 : 인스턴스
>> 대상 그룹 이름 : DEV-TG
>> VPC : ELB-vpc
대상등록
>> 사용 가능한 인스턴스 : Web-Server1-EC2
MGT-TG 대상 그룹 생성
>> DEV-TG과 동일한 방법으로 하되 네이밍만 변경함. 그리고 생성
대상은 Server2, Server3을 선택하여 `보류 중인 것으로 포함`으로 하여 생성함.
🖼️ [이미지] DEV-TG(서버1) / MGT-TG(서버2·3) 생성
03. /dev/* 규칙 추가
1단계: 규칙 추가
>> 이름 : DEV
>> 조건
>> 조건 추가
>> 경로
>> 결로 조건 값 : /dev/*
>> 작업
>> 대상 그룹으로 전달
>> 대상 그룹 : DEV-TG
>> 다음(클릭)
2단계 : 규칙 우선 순위 설정
>> 리스너 규칙
>> 우선 순위 : 1
>> 다음(클릭)
3단계 : 검토 및 생성
>> 규치 추가(클릭)
EC2 → 로드밸런서 → 리스너 및 규칙 탭 → HTTP:80 선택 → 규칙 관리 → 규칙 추가.
이름: DEV
조건: 조건 추가 → 경로 → /dev/*
작업: 대상 그룹으로 전달 → DEV-TG
우선순위: 1
🖼️ [이미지] /dev/* 규칙(조건=경로, 작업=DEV-TG, 우선순위 1)
04. /mgt/* 규칙 추가
같은 방식으로:
이름: MGT, 조건: 경로 /mgt/*, 작업: MGT-TG로 전달, 우선순위: 2
🖼️ [이미지] /mgt/* 규칙(MGT-TG, 우선순위 2)
💡 리스너 규칙 & 우선순위 — ALB는 들어온 요청을 우선순위 번호 순(작은 것부터) 으로 규칙과 대조합니다. 처음 맞는 규칙을 적용하고, 아무 규칙에도 안 맞으면 기본 동작(ALB-TG, 3대 전체) 으로 보냅니다.
💡 경로 패턴 /dev/* — /dev/ 로 시작하는 모든 URL을 의미(*=와일드카드).
05. 동작 확인
🖼️경로별 curl 분산 결과
dev 경로에 접근
mgt 경로에 접근
반복문을 활용해 dev 경로에 curl 접속테스트
반복문을 활용해 mgt 경로에 curl 접속테스트
반복문을 활용해 dev(x), mgt(x) 해당 되지 않는 경로 curl 접속 테스트
# 이제 /dev는 항상 서버1로만 → 에러 없음
curl $ALB/dev/index.html --silent
for i in {1..30}; do curl $ALB/dev/ --silent ; done | sort | uniq -c | sort -nr
# /mgt는 서버2·3으로 분산
curl $ALB/mgt/index.html --silent
for i in {1..60}; do curl $ALB/mgt/ --silent ; done | sort | uniq -c | sort -nr
# 그 외 기본 경로는 여전히 3대 전체로
for i in {1..90}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr
결과 해석: /dev/는 Server-1만, /mgt/는 Server-2·3, 기본(/)은 세 대 전부로 나뉩니다. 경로에 따라 다른 서버 그룹으로 가는 게 확인됩니다.
06. User-Agent(헤더) 기반 규칙 — 스마트폰 차단
ALB는 경로뿐 아니라 HTTP 헤더로도 분기할 수 있습니다. 예로 모바일(iPhone/Android) 접속을 막아봅니다.
로드밸런싱 > 로드밸런서 > 리스너 및 규칙 > HTTP:80 > 규칙관리
ALB의 DNS를 휴대폰(아이폰, 안드로이드)에서 브라우저의 주소창에 입력하고 접속 시도
규칙 추가:
이름: User-Agent
조건: 조건 추가 → HTTP 헤더
헤더 이름: User-Agent
헤더 값: *iPhone* + OR 추가 *Android*
작업: 고정 응답 반환 → 응답 본문 iPhone or Android Access Deny
우선순위: 3
🖼️ [이미지] User-Agent 규칙(헤더 조건 + 고정 응답)
💡 User-Agent — 브라우저가 자기 정보(기기·OS·브라우저)를 담아 보내는 HTTP 헤더. 여기에 iPhone/Android가 들어 있으면 모바일 접속으로 판단.
💡 고정 응답(Fixed Response) — 대상 서버로 보내지 않고 ALB가 직접 정해진 응답을 돌려주는 작업. 여기선 차단 메시지를 반환합니다. 확인: PC curl은 정상, 스마트폰 브라우저로 접속하면 차단 메시지가 뜹니다. (dig $ALB +short로 IP 확인 후 폰에서 접속)
마치며 & 다음 편
ALB로 3대 부하분산 → 경로별 라우팅(/dev, /mgt) → 헤더 기반 차단까지 구현했습니다. ALB가 L7(요청 내용) 을 보고 똑똑하게 분기한다는 게 핵심입니다.
이번 편 핵심: "ALB는 IP가 아니라 '요청의 내용(경로·헤더)'을 보고 어디로 보낼지 정한다."
다음 편 예고 — ③편 NLB: 이번엔 웹(HTTP)이 아니라 UDP(SNMP, 161) 트래픽을 분산하는 Network Load Balancer를 만들고, ALB와의 차이(L4 vs L7, 교차 영역 기본값 차이)를 직접 확인합니다.
대상 그룹·리스너·교차 영역 LB·경로 패턴·우선순위·User-Agent·고정 응답 등 용어를 풀이 박스로 설명하고, curl/dig/for 명령을 한 줄씩 해설했습니다. 이어서 ③NLB편을 진행할까요?