실습 2-2 _ ELB 실습 ②편 — ALB

2026. 6. 8. 20:37·클라우드 컴퓨팅/AWS

ELB 실습 ②편 — Application Load Balancer(ALB)


 

①편에서 만든 웹 서버 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는 이걸 기본으로 켜둡니다.

 

🖼️ [이미지] curl 반복 결과(Server-1/2/3 분산 카운트)

 

경로 기반 라우팅이 왜 필요한가

# /dev 페이지는 서버1에만 있음
curl $ALB/dev/index.html --silent

# /mgt 페이지는 서버2·3에만 있음
curl $ALB/mgt/index.html --silent

⚠️ 지금은 ALB가 3대 아무 데나 분산하므로:

- /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편을 진행할까요?

저작자표시 (새창열림)

'클라우드 컴퓨팅 > AWS' 카테고리의 다른 글

실습 2-4 _ ELB 실습 ④편 — 출발지 IP 보존  (1) 2026.06.09
실습 2-1_ ELB 실습 ①편 — 환경 구성  (0) 2026.06.08
실습 1-9 _ NAT Gateway  (0) 2026.06.06
실습 1-8 _ Private EC2  (0) 2026.06.06
실습 1-7 _ Private Subnet & Private RT  (0) 2026.06.06
'클라우드 컴퓨팅/AWS' 카테고리의 다른 글
  • 실습 2-4 _ ELB 실습 ④편 — 출발지 IP 보존
  • 실습 2-1_ ELB 실습 ①편 — 환경 구성
  • 실습 1-9 _ NAT Gateway
  • 실습 1-8 _ Private EC2
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (301)
      • 여러가지 (108)
        • 알고리즘 & 자료구조 (73)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (39)
        • 파이썬 (31)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (17)
        • 도커 (2)
        • AWS (15)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (1)
        • 정보처리기사 (0)
        • 정보보안기사 (1)
        • 네트워크관리사 (0)
      • 재태크 (0)
        • 암호화폐 (0)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    시험
    항해99
    Spring WebFlux
    프로그래머스
    RDS
    Python
    취업리부트
    reactor
    Spring Boot
    java
    파이썬
    SAA
    그리디
    EC2
    자바
    Redis
    FastAPI
    DP
    백준
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    spring
    celery
    mybatis
    Docker-compose
    docker
    OOP
    완전탐색
    AWS
    WebFlux
    ecs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
실습 2-2 _ ELB 실습 ②편 — ALB
상단으로

티스토리툴바