Application Load Balancer에 대해

Application Load Balancer 구축 과정에 대해 정리해 봤습니다.
2021.10.10

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 Application Load Balancer 구축 과정에 대해 정리해 봤습니다.

현재 환경

My-EC2에서 ELB-EC2에 대한 HTTP 서비스와 snmp로 시스템을 확인해 보겠습니다.

curl 18.179.37.68/index.php
curl 18.179.37.68/dev/index2.php
snmpget -v2c -c public 18.179.37.68 system.sysDescr.0

SNMPv2-MIB::sysDescr.0 = STRING: Linux ip-10-0-0-173.ap-northeast-1.compute.internal 4.14.246-187.474.amzn2.x86_64 #1 SMP Tue Sep 7 21:48:11 UTC 2021
x86_64

idnex.php와 dev/index2.php, snmpget이 정상적으로 작동하는 것을 확인할 수 있습니다. ELB-EC2-2 또한 위와 마찬가지입니다.

snmpget 사용은 아래 블로그를 참고해 주세요

ALB를 사용한 로드 밸런싱

ALB 생성 및 타겟 그룹 설정

「로드 밸런서」탭을 클릭하고「Load Balancer 생성」버튼을 클릭합니다.

Application Load Balancer를 선택합니다.

로드 밸런서를 퍼블릭 서브넷에 배치해서, 외부 인터넷과 통신이 되도록 할 생각이기 때문에「Internet -facing」을 선택합니다.

VPC는 로드밸런서의 VPC를 선택합니다.

2개의 가용 영역에서 각각의 서브넷을 선택합니다. 로드 밸런서에서는 가용 영역당 1개의 서브넷만 지정 가능합니다.

보안 그룹은 ELB-SG와 인바운드 그룹을 동일하게 설정해서 하나 만들어줍니다. 리스너 라우팅의 경우 HTTP 80번 포트를 설정하면 됩니다.

그리고「Create target group」을 클릭합니다.

인스턴스를 선택합니다.

타겟 그룹 이름을 입력하고 나머지는 디폴트 값으로 진행합니다.

2개의 인스턴스를 포함해주고, 타겟 그룹 생성을 끝마칩니다.

다시 ALB로 돌아와서 조금 전 생성한 타겟그룹을 추가해준 다음, ALB 생성을 끝마칩니다.

타겟 그룹에서 각 인스턴스의 상태가「healthy」로 되어 있으면 정상 작동 하고 있는 상태입니다.

ALB 테스트

ALB DNS로 HTTP 통신을 시도합니다.

curl ALB-TEST-719965026.ap-northeast-1.elb.amazonaws.com/index.php

ELB-EC2-1과 ELB-EC2-2로 번갈아 가면서 접속되는 것을 확인할 수 있습니다.

하지만 여기서 ELB-EC2-1에서는 dev/index.php를, ELB-EC2-2에서는 mgt/index.php를 주고 싶을 때는 어떻게 하면 될까요?

ELB-EC2-1 인스턴스에만 dev/index.php를 생성할 경우, 현재 로드 밸런서는 라운드 로빈 방식(번갈아 가면서 통신)을 사용하고 있기 때문에 ELB-EC2-2에서 dev/index.php를 찾아서 사용자에게 출력합니다. 하지만 dev/index.php가 없기 때문에 에러 페이지가 뜨게됩니다. 이러한 부분은 경로 기반 라우팅을 통해 해결할 수 있습니다.

경로 기반 라우팅

타겟 그룹으로 이동합니다.

Dev-Group라는 이름으로 타겟 그룹을 하나 생성합니다. 인스턴스는 dev/index.php가 있는 ELB-EC2-1을 선택하고 생성을 끝마칩니다.

MGT-Group도 마찬가지로 ELB-EC2-2를 선택하고 생성을 끝마칩니다.

ALB로 돌아와서 리스너 탭으로 들어갑니다. 그리고「규칙 보기/편집」을 클릭합니다.

  • 버튼을 눌러서 규칙을 추가합니다. 먼저 경로에는「/dev/*」전달 대상에는「Dev-Group」를 입력하고 저장 버튼을 클릭합니다. MGT-Group 규칙도 동일하게 추가합니다.

/dev 경로의 URL은 Dev-Group에 속한 인스턴스로 전달 하고, /mgt 경로의 URL은 MGT-Group에 속한 인스턴스로 전달합니다.

실제로 확인해 보면, index.php는 ELB-EC2-1, ELB-EC2-2로 번갈아 가면서 전달하지만, dev/index2.php는 ELB-EC2-1에서만 전달하고, mgt/index2.php는 ELB-EC2-2에서만 전달하는 것을 볼 수 있습니다. 이런식으로 경로 기반 라우팅을 통해 원하는 형태로 부하 분산을 할 수 있습니다.

참고