본문 바로가기

Backend/서버 구축

AWS ELB(Elastic Load Balancing)를 이용한 서버 트래픽 분산

 

ELB에 대한 실습을 진행하다가

나중에 분명히 도움이 될 것 같아 글을 쓰게됐다.

 

 

웹 트래픽이 증가할 때 이에 대한 처리 방식으로는

스케일아웃(Scale out) / 스케일업(Scale up) 으로 나눌 수 있다.

 

스케일아웃은 서버의 개수를 늘리는 처리방식이고,

스케일업은 한대의 서버를 업그레이드 하는 것이다.

출처 - https://m.blog.naver.com/islove8587/220548900044

 

AWS의 ELB(Elastic Load Balancing)는 스케일아웃에 해당한다.

 

이론은 정말 간단하다.

동일한 ec2 인스턴스를 2개 이상 생성해 트래픽을 배분하는 것이다.

 

우리는 새로운 도메인을 부여받고, 해당 도메인으로 request를 보내면

Load Balancer가 각 인스턴스로 알아서 배분해 이를 처리한다.

 

사실 인스턴스 자체의 cpu성능이나 용량을 키우면 어지간한 트래픽은 감당할 수 있을거라 생각하고,

ELB가 실무에서 실제 쓰이는 기능일까 싶기도 하지만...

난 이 기능을 꼭 쓰고 말테니까!😤

 

 

 

시작 전에

기본적으로 알고 있어야 할 아주아주 최소한의 AWS 네트워크 구조나 용어는 다음과 같다.

 

VPC : AWS의 가상 네트워크 공간 (가장 큰 네트워크 단위)

서브넷 : VPC 내부의 분리된 IP Block (VPC의 부분집합) / private, public으로 구분됨

인터넷 게이트웨이 : 외부와 통신하는 통로로, public 서브넷에만 연결 가능

라우팅 테이블 : 서브넷에서 데이터가 이동할 경로를 지정

 

 

이제 실제 ELB를 사용할 볼텐데, 과정은 총 5단계이다.

1. 네트워크 구성

2. ec2 인스턴스 생성

3. LAMP 서버 구성

4. Custom ec2 생성

5. Elastic Load Balancing


1. 네트워크 구성

먼저 AWS의 가장 시작 단계라 할 수 있는 네트워크를 구성해야 한다.

크게 VPC생성과 보안그룹 생성으로 구분할 수 있다.

사실 ec2만 사용하던 시절에는 VPC의 존재를 몰랐는데, 따로 설정을 하지 않으면 자동으로 생성이 되기 때문이다.

 

우선 AWS콘솔에서 VPC를 검색해 VPC - VPC생성 버튼으로 생성을 시작한다.

 

 

'VPC 등' 으로 선택 후 이름을 적절히 작성한다.

IPv4 CIDR 블록이 10.0.0.0/16인 만큼, 우리가 쓸 수 있는 주소의 개수는 256*256개 (정도)이다.

가용 영역은 2개를 사용해 각 가용 영역에 서브넷과 인스턴트를 배치시킬 예정이다.

'AZ 사용자 지정'을 펼쳐보면 어떤 가용 영역을 사용할지 선택할 수도 있는데,

기본 값은 a,b로 되어있지만 나는 a,c로 선택했다.

리전에 따라 가용 영역 수는 상이할 수 있다.

 

 

실제로 접속을 해야 하기에 퍼블릭 서브넷은 2개, 프라이빗은 사용할 일이 없어 0개로 지정한다.

서브넷 CIDR 블록은 각각 1과 2로 주소를 지정해 준다.

 

 

우측을 보면 다음과 같은 네트워크 구조가 표시된다.

내가 생성한 VPC와 서브넷 2개, 그리고 자동으로 생성된 라우팅 테이블과 인터넷 게이트웨이까지 확인할 수 있다.

이 상태로 VPC 생성을 한다.

 

다음으로 보안그룹 생성을 한다.

 

 

검색창으로 찾아도 되고, 사진처럼 왼쪽 리스트에서도 확인 가능하다.

보안그룹 생성 버튼으로 생성을 시작한다.

 

 

반드시 좀 전에 생성한 VPC를 선택해야 해당 네트워크로 보안그룹이 생성된다.

 

 

인바운드 규칙은 SSH와 HTTP 두 유형 모두 IPv4로 모든 접속을 허용하고 보안그룹을 생성하면 완성이다.

이제 우리가 사용할 수 있는 하나의 네트워크가 모두 구성이 됐다!

 

 

2. ec2 인스턴스 생성

이제 인스턴스를 생성할 차례이다.

실제 request가 서로 다른 2개의 인스턴스로 요청되는지 확인하는 과정이기에,

1개의 인스턴스를 생성 후 이를 복제해 Load Balancing이 잘 이루어지는지 확인 할 것이다.

 

EC2 페이지로 이동해 인스턴스 생성 버튼을 클릭한다.

 

 

이름은 적당히 정해주고 운영체제와 인스턴스 유형을 지정한다.

여기서 인스턴스 이름에 버전은 구분하는게 좋을 것 같다.

 

 

사용하던 키가 있다면 키를 선택하고 없다면 키 페어를 생성해야 한다.

 

이제 중요한 네트워크 설정을 해줘야 한다.

 

 

아마 디폴트로 지정이 되어있을 VPC는 우리가 만든 VPC를 선택하고,

서브넷은 생성한 2개중 a로 선택한다.

'기존 보안 그룹 선택'으로 지정하고 역시 좀 전에 만든 보안그룹을 사용해 인스턴스를 생성한다.

 

이제 Elastic IP를 생성해 인스턴스에 붙여주도록 한다.

탄력적 IP를 생성을 간단히 진행하고 연결만 하면 된다.

 

 

이제 인스턴스 생성은 완성이다.

 

SSH로 원활한 접속이 가능한지 확인해보자.

 

인스턴스 목록에서 인스턴스 ID를 클릭해 세부정보로 이동하고, 우측 상단의 '연결'을 클릭한다.

SSH 클라이언트의 맨 아래 있는 ssh 명령어를 복사한다.

인스턴스의 키 페어가 저장된 디렉토리에서 붙여넣기 하면 간단히 접속할 수 있다.

 

접속 화면

 

이제 간단한 LAMP 서버를 생성해 인스턴스를 테스트해보자.

 

3. LAMP 서버 구성

먼저 소프트웨어 업데이트를 진행한다.

sudo yum update -y

MariaDB와 PHP 패키지를 가져오고

sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2

웹서버를 설치한다.

sudo yum install -y httpd mariadb-server

웹서버 시작.

sudo systemctl start httpd

부팅할 때마다 웹서버 시작하도록 설정

sudo systemctl enable httpd

httpd 실행 확인

sudo systemctl is-enabled httpd

 

브라우저에서 인스턴스의 탄력적 IP 주소로 접속해보면 서버가 잘 실행 된 것을 확인할 수 있다.

 

 

이제 트래픽 분산이 잘 이루어지는지 확인을 위해

브라우저를 통해 인스턴스의 IP 주소를 확인하려 한다.

 

먼저 서버의 페이지 추가를 위해 권한을 변경한다.

 

 

html 디렉토리로 이동해 간단한 php 파일 하나를 생성한다.

 

 

서버의 IP 주소를 확인할 수 있는 코드를 작성한다.

<?php
echo "Hello! My IP address is: ".$_SERVER['SERVER_ADDR']; ?>

 

파일을 저장하면 브라우저로 확인할 수 있다.

 

 

이제 이렇게 생성한 ec2 서버를 복제할 차례이다!

 

 

4. Custom ec2 생성

Custom AMI를 이용해 인스턴스를 복제하는 과정이다.

 

 

좀전에 만든 인스턴스를 선택 후 작업 - 이미지 및 템플릿 - 이미지 생성 순으로 선택하고

이미지 이름만 적절히 지정해 바로 이미지를 생성하면 된다.

 

이제 인스턴스를 생성 할 차례이다.

 

 

앞서 만든 인스턴스와 구분하기 위해 버전2를 표기 하는게 좋겠다.

 

 

이제 중요한 점은 Quick Start가 아닌 내 AMI로 인스턴스를 생성해야한다.

사진과 같이 방금 만든 이미지를 선택한다.

키 페어는 버전1 인스턴스와 동일하게 하면 된다.

 

 

네트워크에서,

VPC와 보안 그룹은 버전1 인스턴스와 동일하게 하고

서브넷만 다른 서브넷을 선택한다.

 

버전1에서 a 서브넷을 선택했으니 이번엔 c를 선택했다.

VPC를 생성할 때 선택한 가용 영역에 맞춰 선택하고 인스턴스를 생성한다.

 

 

이제 버전1 인스턴스에 붙여놓았던 탄력적 IP를 버전2로 옮긴다.

 

 

앞선 과정과 동일하게 진행하면 되고,

버전2 인스턴스를 선택 후 재연결 체크를 한 뒤 연결하면 된다.

 

 

다시 탄력적 IP로 접속해보면

 

버전1과는 다른 것을 확일할 수 있다.

 

 

5. Elastic Load Balancing

이제 ELB를 생성해 두 인스턴스를 연결해볼 차례이다.

인스턴스 페이지에도 로드 밸런싱을 찾을 수 있다.

 

로드 밸런서 생성 클릭 후 Application Load Balancer를 선택한다.

이름만 자유롭게 지정하고 Network mapping으로 넘어간다.

 

처음에 생성한 VPC를 선택하고

Mappings에 보이는 서브넷 두개를 모두 선택 해준다.

 

 

역시 초반에 생성한 보안그룹을 선택하고

 

 

타겟 그룹을 선택해야 한다.

타겟 그룹은 로드 밸런서가 트래빅을 배분하는 타겟을 말한다.

하지만 현재 생성한 타겟 그룹이 없으니 

Create target group을 선택한다.

 

그룹 생성 페이지로 넘어가는데

다른 부분은 손대지 않고 그룹 이름만 설정해 Next로 넘어간다.

 

 

우리가 생성한 인스턴스가 보이게 되는데

2개 모두 선택 후, Include as pending below 버튼을 클릭하고

create하면 대상 그룹이 생성된다.

 

이제 다시 아까의 화면으로 넘어간다.

 

 

오른쪽 새로고침 버튼을 누르면 생성한 대상 그룹이 나타난다.

이를 선택 후 바로 Create load balancer 버튼을 눌러 ELB를 생성한다.

 

 

생성이 완료되면 다음과 같이 확인이 가능하다.

상태에 '프로비저닝 중'이 '활성' 으로 바뀌면 접속할 수 있다.

 

DNS이름을 복사해 접속해보면 인스턴스에 접속했을때와 같은 화면을 볼 수 있는데,

 

DNS 이름/test.php를 접속해 새로고침을 해보면

2개의 인스턴스에 번갈아 접속한다는 것을 확인할 수 있다!