Cloud Architect/AWS

AWS Elastic Load Balancing 적용하기

sangwonYoon 2023. 7. 23. 22:03

법률 조언 챗봇 프로젝트를 진행하기 위해 네이버 커넥트재단으로부터 제공받은 V100 서버 5대 중 4대를 모델 서버로 사용하고 1대를 CI 테스트 서버 및 모델 학습 서버로 사용하기로 계획했다. 따라서 이번 포스팅에서는 AWS ELB를 활용해 트래픽을 4대의 모델 서버에 분산시킨 방법을 작성해보려고 한다.

 

Proxy 서버 역할의 EC2 인스턴스 생성

컨테이너로 패키징된 V100 서버가 외부와 통신하기 위해 각각의 V100 서버에 Proxy 서버의 역할을 하는 EC2 인스턴스를 ssh 포트 포워딩으로 연결했다. 이 EC2는 ALB(Application Load Balancer)로부터 넘어온 트래픽을 V100 서버로 전달하는 역할을 할 것이다.

 

Application Load Balancer

이제 이 4대의 EC2 인스턴스와 Application Load Balancer를 연결해야 한다. ALB의 8585번 포트로 들어오는 트래픽을 위에서 생성한 EC2의 8585번 포트로 라우팅하도록 생성할 것이다.

Application Load Balancer를 생성하는 방법은 EC2 서비스에 들어가서 좌측 탭의 로드 밸런서를 클릭 후, 로드 밸런서 생성 버튼을 클릭하면 된다.

 

다양한 로드 밸런서의 유형 중 우리는 HTTP 통신 기반의 REST API를 서버에 보내야하기 때문에 Application Load Balancer를 생성한다.

 

네트워크 매핑에서 가용 영역을 2개 이상 선택해야 한다. 여기서 선택한 가용 영역에 존재하는 대상으로 트래픽이 라우팅되기 때문에 앞서 생성한 EC2가 존재하는 ap-northeast-2a와 ap-northeast-2c를 선택했다.

 

웹 서비스를 위한 서버를 구성중이므로 모든 IP 주소에서 8585번 포트에 접근할 수 있도록 보안 그룹을 설정한다.

 

리스너는 로드 밸런서의 입구이고, 대상 그룹은 들어온 트래픽을 전달할 대상이다. ALB의 8585번 포트로 트래픽을 받을 것이기 때문에 HTTP 프로토콜의 8585번 포트를 리스너로 설정하고, 이 트래픽을 전달받을 대상 그룹을 생성하기 위해 대상 그룹 생성 버튼을 클릭한다.

 

대상 유형은 EC2 인스턴스로 전달할 것이기 때문에 인스턴스를 선택하면 된다.

 

이 부분은 대상 그룹이 트래픽을 전달받을 프로토콜과 포트 번호를 입력하면 된다.

 

상태 검사는 로드 밸런서와 연결된 대상들이 정상적으로 작동하는지 테스트하기 위해 주기적으로 요청을 보내서 확인하는 시스템이다. 여기서 상태 검사 경로로 요청을 보냈을 때 정상적인 응답이 반환되어야 정상으로 판단하기 때문에 서버에서 간단한 값을 넘겨줄 수 있도록 구현하는 것이 좋다.

 

AWS 비용 문제 때문에 3개의 인스턴스를 꺼놔서 이 캡쳐본에서는 1개의 EC2만 나타난다.

위에서 생성한 인스턴스 4개를 체크하여 아래에 보류 중인 것으로 포함 버튼을 눌러 대상에 추가한뒤, 대상 그룹 생성을 완료한다.

 

다시 아까 이 화면으로 돌아와 새로고침 버튼을 누르면 방금 생성한 대상 그룹을 확인할 수 있다. 마지막으로 요약을 읽고 문제가 없다면 로드 밸런서를 생성한다.

 

Network Load Balancer

Application Load Balance는 작은 문제점이 하나 있다. 고정 IP를 사용할 수 없다는 것이다. 고정 IP를 사용하기 위해서는 크게 2가지 방법이 있다.

  1. AWS Global Accelerator 사용
  2. ALB 앞에 NLB(Network Load Balancer) 배치

첫번째 방식은 추가 비용이 들기 때문에 두번째 방식을 사용하기로 했다. NLB는 자체적으로 고정 IP를 사용할 수 있으므로, NLB의 고정 IP로 보낸 요청을 ALB로 전달하고, 다시 그 요청을 대상 그룹(EC2 인스턴스)에게 전달한다.

NLB를 생성하는 방법은 ALB와 동일하게 생성하되, 세가지만 주의하면 된다.
첫번째는 NLB는 따로 보안 그룹을 갖지 않는다.

 

두번째는 대상 그룹을 생성할 때 대상 유형을 인스턴스가 아닌, Application Load Balancer로 선택해야 한다.

 

세번째는 NLB에 고정 IP를 등록해야 하기 때문에 네트워크 매핑에서 가용 영역을 선택하는 부분에서 탄력적 IP 주소를 넣어줘야 한다. 탄력적 IP 주소는 EC2 서비스의 좌측 탭에 있는 탄력적 IP에서 할당받을 수 있다. 이제 이 IP 주소가 모델 서버에 요청할 때 사용되는 IP 주소가 된다.

 

아키텍처 구성도

웹 서버에서 모델 서버로 REST API 요청을 보내면 위 그림과 같은 구조로 전달된다.

이로써 기존 V100 서버를 1대 사용하여 서비스할 때보다 4배 많은 트래픽을 처리할 수 있게 되었다. 또한 Applcation Load Balancer의 기본 기능인 상태 검사를 통해 모델 서버에 장애가 발생할 경우, 해당 서버로 트래픽을 보내지 않음으로써 서버의 장애가 서비스의 장애로 이어지는 것을 방지할 수 있게 되었다.