[LoadBalancer로 트래픽 분산하기] - AWS Elastic LoadBalancer 사용하기

Hyunjun Kim·2025년 5월 15일
0

Data_Engineering

목록 보기
71/153

4 AWS Elastic LoadBalancer 사용하기

4.1 LoadBalancer Type 선택하기

공식 문서
AWS에는 3가지 타입의 LoadBalancer가 있다.

  • Classic Loadbalancer 는 retired 되었다.

4.1.1 Network Load Balancer (NLB)

작동 계층

  • L4 (Transport Layer) – TCP, UDP 기반

특징

  • L4 레벨의 정보(IP, 포트 등)만을 바탕으로 트래픽을 분산.
  • 트래픽 분산 규칙은 사전에 정의된 방식으로 자동 처리됨.
  • L7까지 확인하지 않으므로 처리 속도가 빠름.

사용 예시

  • 고성능이 요구되고, 애플리케이션 레벨에서 분산할 필요 없는 경우.

참고

  • 분산 방식은 4.2.1 Network Load Balancer의 부하 분산 방법에서 설명됨.

4.1.2 Application Load Balancer (ALB)

작동 계층

  • L7 (Application Layer) – HTTP, HTTPS 기반

특징

  • URL 경로, Hostname, Header, Query string 등 L7 정보 기반의 정교한 트래픽 분산 가능.
  • 사용자 정의 라우팅 규칙 설정 가능 (예: 경로 기반, 호스트 기반).
  • L7까지 확인하므로 NLB보다 처리 속도는 다소 느림.

사용 예시

  • 웹 애플리케이션, 마이크로서비스 아키텍처 등 복잡한 트래픽 라우팅이 필요한 경우.

4.1.3 Gateway Load Balancer (GLB)

작동 계층

  • 주로 GENEVE 프로토콜 기반 (Generic Network Virtualization Encapsulation)

특징

  • GENEVE 프로토콜을 사용해 서드파티 네트워크 서비스와 통신 가능.
  • 인프라(네트워크 장비, 보안 장비 등)를 서드파티가 직접 관리하면서, 클라이언트는 이를 투명하게 사용할 수 있음.
  • 보안, 운영 편의성, 확장성 측면에서 유리.

사용 예시

  • 서드파티 보안 솔루션, 특수 네트워크 장비를 SaaS 형태로 제공하는 경우.

실습 제외 이유

  • GENEVE를 지원하는 특정 서비스와 연결 설정만으로 동작하기 때문에 실습 난이도가 낮고 별도 설정이 많지 않음.

4.2 Network LoadBalancer로 부하 분산하기

4.2.1 Network Load Balancer의 부하 분산 방법

Target Group에서 Flow hash algorithm의 기본 규칙을 따라서 대상을 선택한다. 알고리즘은 다음을 기반으로 한다.

  • 프로토콜
  • 소스 IP 주소 및 소스 포트
  • 대상 IP 주소 및 대상 포트
  • TCP 시퀀스 번호

알고리즘에 따라 Client로부터의 연결은 다음과 같은 특징을 따른다.
1. 각 개별 TCP 연결은 연결 수명(라이프사이클) 동안 하나의 대상에 라우팅 된다.
2. 하나의 클라이언트로부터 요청된 TCP 연결들은 소스 포트와 시퀀스 번호가 서로 다르므로 다른 대상에 라우팅될 수 있다.

운영체제 TCP Client 는 자신의 host 에서 해당연결에서 사용할 source port
number (Ephemeral port, Ephemeral port range)를 연결마다 자동으로 할당
한다.

TCP 의 sequence number 는 각 연결마다 0부터 시작하는 것이 아니다.
ISN(initial sequence number)는 해당 연결안에서 unique하고, 0~2^32-1(max of 4bytes unsigned int) 사이의 랜덤값이다.

4.2.2 실습용 서버 세팅하기

두 개의 EC2 인스턴스에 다음 명령어로 간단한 서버를 띄운다.

  1. 응답에 사용할 index.html 파일을 만든다. Body의 내용을 바꿔서 어떤 서버인지 구분할 수 있도록 하자.
<!DOCTYPE html>
<html>
	<head>
	<!-- head definitions go here -->
	Hellow World
	</head>
	<body>
	<!-- the content goes here -->
	Server 1 or 2
	</body>
</html>
  1. index.html 파일을 ubuntu home에 위치시킨다.

  2. 두 개의 서버 각각에 다음 명령어로 echo server 를 띄운다.

while true; do { \
	echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <index.html)\r\n\r\n";\
	cat index.html; } | nc -l -p 8080 ; \
done
  1. 해당 서버 주소와 port (8080)로 간단한 curl 요청 또는 브라우저로 접속을 해서 응답을 확인한다.
curl ${IP}:${PORT}

4.2.3 Target Group 생성하기

Network Load Balancer 는 연결할 대상을 Target Group 이라는 추상화된 대상으로 지정한다.

EC2 > Traget groups

  1. Create target group

  2. instances 선택

  3. Target group name: de-lb-tcp

  4. Protocol: TCP

  5. Port : 8080

  6. VPC: 자신의 VPC 선택

  7. Health Check

    • protocol: TCP
  8. Advanced: 해당 설정은 실습의 용이를 위해서 작게 세팅

    • Port: Traffic port
    • Healthy threshold: 2
    • Interval: 10s
  9. Next를 누르고

  10. EC2 인스턴스를 선택한다.

  11. include as pending below 클릭

    • 아래 review targets 에서 확인

4.2.4 Network LoadBalancer 생성하기

EC2 > Load Balancers

  1. Create Load Balancer

  2. Network Load Balancer 선택

  3. Load balancer name: de-network-lb

  4. Schema: internet-facing

  5. IP address type: IPv4

  6. Network mapping

    • a. 자신의 VCP 선택
    • b. 모든 AZ 선택
  7. Listeners and routing

    • a. Listener
      • i. Protocol: TCP
      • ii. Port: 8080
      • iii. Default action: target group 선택
  8. Create 버튼

    • LoadBalancer 대시보드에서 State 가 Provisioning > Active 로 바뀌어야 이용가
      능하다.

4.2.5 Network LoadBalancer 로 트래픽 연결하기

EC2 > LoadBalancing > LoadBalancers

  1. 생성한 LoadBalancer 선택
  2. 아래 Description 에서 DNS name copy
  3. curl 또는 웹브라우저로 해당 $DNSname:$port 로 응답 확인
    • a. 반복 요청해서 두 개의 서버에서 응답하는지 확인

4.2.6 Cross-zone load balancing

장애 방지를 위해 Availability zone 별로 서비스가 가용하도록 구성한 경우, 다음 옵션으로 Cross-zone load balancing 을 선택하면, 가능한 availability zone들에게 고르게 트래픽을 분배할 수 있다.

  1. Load Balancer 선택
  2. Attributes
  3. Edit Attributes
  4. Cross-zone loadbalancing : enable 선택
  5. Save

4.3 Application LoadBalancer로 부하 분산하기

4.3.1 Application Load Balancer의 부하 분산 방법

다음 과정으로 부하 분산 방법을 결정한다.

  1. Priority Order(우선순위)로 Lister Rule 들 중 어떤 규칙을 적용할지를 평가한다.

  2. Rule 에 해당하는 target group을 선택한다.

    • a. Default 는 Round Robin이다.
    • b. Routing은 Target Group과 독립적이다. 예를 들어서 하나의 ec2 인스턴스가 두 개의 target group에 속해도 상관이 없다.

4.3.2 실습용 서버 세팅하기

4.2.2 실습용 서버 세팅하기 와 동일하다.

4.3.3 Target Group 생성하기

Application Load Balancer 는 연결할 대상을 Target Group 이라는 추상화된 대상으로 지정한다.
실습을 위해서 준비한 2개의 EC2인스턴스를 대상으로 각각 별도의 Target Group으로 만들어준다.

EC2 > Traget groups

  1. Create target group

  2. instances 선택

  3. Target group name: de-lb-app-1 , de-lb-app-2

  4. Protocol: HTTP

  5. Port : 8080

  6. VPC: 자신의 VPC 선택

  7. Protocol version: HTTP1

  8. Health Check

    • a. protocol: HTTP
    • b. path: /
  9. Advanced: 해당 설정은 실습의 용이를 위해서 작게 세팅

    • a. Healthy threshold: 2
    • b. Unhealthy threshold: 2
    • c. Timeout: 2
    • d. Interval: 5
  10. Next를 누르고

  11. EC2 인스턴스를 선택한다.

  • a. de-lb-app-1 이면 1번 instance를 선태한다.
  • b. de-lb-app-2 이면 2번 instance를 선택한다.

4.3.4 Application LoadBalancer 생성하기

EC2 > Load Balancers

  1. Create Load Balancer

  2. Application Load Balancer 선택

  3. Load balancer name: de-application-lb

  4. Schema: internet-facing

  5. IP address type: IPv4

  6. Network mapping

    • a. 자신의 VCP 선택
    • b. 모든 AZ 선택
  7. Security groups

    • a. security 그룹을 선택하고, inbound/outbound network ACL을 security group을 통해서 운영중에 제어할 수 있다.
    • b. 실습을 위해서 모든 트래픽을 허용하는 security group을 만들고 그것을 선택한다.
  8. Listeners and routing

    • a. Listener
      • i. Protocol: HTTP
      • ii. Port: 8080
      • iii. Default action: de-lb-app-1 , de-lb-app-2 중 하나를 선택한다.
          1. 생성후에 Listener 를 변경해야한다.
  9. Create 버튼

    • a. LoadBalancer 대시보드에서 State 가 Provisioning > Active 로 바뀌어야 이용가능하다.
  10. 생성된 후에 Listeners 탭에서 생성된 Listeners 선택하고, edit 버튼을 눌러서 기본 규칙을 수정한다.

    • a. Forward to
      • i. Target group
      • ii. de-lb-app-1 선택, weight 1
      • iii. de-lb-app-2 선택, weight 2
    • b. Save changes

4.3.5 Network LoadBalancer 로 트래픽 연결하기

EC2 > LoadBalancing > LoadBalancers

  1. 생성한 LoadBalancer 선택
  2. 아래 Description 에서 DNS name copy
  3. curl 또는 웹브라우저로 해당 $DNSname:$port 로 응답 확인
    • a. 반복 요청해서 두 개의 서버에서 응답하는지 확인

4.3.6 Application LoadBalancer의 Rule 변경하기

EC2 > LoadBalancing > LoadBalancers

  1. 생성한 LoadBalancer 선택

  2. 아래 Listners 에서 Rules > View/edit rules

  3. + 버튼을 눌러서 편집한다.

  4. insert rule for TARGET 1

    • a. IF condition
      • i. Http header
      • ii. TARGET is 1
    • b. THEN action
      • i. Forward to...
      • ii. de-lb-app-1
  5. insert rule for TARGET 2

    • a. IF condition
      • i. Http header
      • ii. TARGET is 2
    • b. THEN action
      • i. Forward to...
      • ii. de-lb-app-2
  6. SAVE 버튼

4.3.7 Application Load Balancer의 변경된 Rule 확인하기

Scenario 1

  1. CURL 로 $DNS:$PORT 로 header 정보 없이 요청을 보낸다.
  2. 1번 서버, 2번 서버의 내용이 1:1의 비율로(또는 설정한 weight에 해당하는 비율로) 응답하는지 확인한다.

Scenario 2

  1. CURL 로 $DNS:$PORT 로 header 정보와 함께 요청을 보낸다.
curl -i -H "TARGET:1" $DNS:$PORT
  1. 1번 서버의 내용만 응답하는지 확인한다.

Scenario 3

  1. CURL 로 $DNS:$PORT 로 header 정보와 함께 요청을 보낸다.
curl -i -H "TARGET:2" $DNS:$PORT
  1. 2번 서버의 내용만 응답하는지 확인한다.
profile
Data Analytics Engineer 가 되

0개의 댓글