ELB는 Elastic Load Balancing의 약자로 EC2를 대상으로한 요청을 여러대의 EC2 인스턴스로 자동으로 분배한다. 기존에는 이런 작업을 하기 위해서는 L4/L7의 로드 밸런서를 이용하거나 Apache나 Tomcat의 로드 밸런싱 기능을 이용할 수 있지만 그 절차와 방법이 복잡하다.
AWS에서는 간편하고 직관적인 Web UI를 제공하여 클릭 몇 번으로 이런 로드 밸런싱 기술을 이용할 수 있다.
AWS에서 안내하는 ELB의 특징은 다음과 같다.
- 고가용성 : 수신되는 트래픽을 단일 AZ 또한 여러 AZ의 EC2 인스턴스에 걸쳐 배포할 수 있다.
- 상태확인 : ELB는 EC2 인스턴스의 상태를 감지하여 비정상적 인스턴스를 발견한 경우 해당 인스턴스를 사용하지 않고 다른 정상적인 인스턴스로 요청을 분배한다.
- 보안기능 : VPC를 사용할 경우 ELB와 관련된 보안 그룹을 생성 및 관리하여 추가 네트워킹 및 보안 옵션을 제공할 수 있다. 또한 공인 IP 주소 없이 로드 밸런서를 생성하여 인터넷에 연결되지 않는 내부 로드 밸런서로 사용할 수도 있다.
- 고정세션 : ELB는 쿠키를 사용하여 사용자 세션을 특정 EC2 인스턴스에 고정할 수 있다.
- 운영모니터링 : 요청 수 및 요청 지연 시간과 같은 ELB Metric은 CloudWatch를 통해 보고 된다.
기타 로깅 및 4/7 계층 로드 밸런싱과 IPv6 지원 등의 특징을 가지고 있다.
2. EC2 인스턴스 생성
EC2가 이미 기존에 존재한다면 그대로 사용해도 좋고 새로 만들어도 좋다. EC2 인스턴스 생성 절차에 대한 내용은 이곳을 확인한다. 요청을 HTTP 80포트로 할 것이므로 Security Group 설정 시 80 포트에 대해서 룰을 적용한다.

80 포트 룰 적용
2개의 인스턴스를 대상으로 할 것이므로 EC2 인스턴스를 2개 생성한다.

작동중인 2개의 EC2 인스턴스
3. 로드 밸런서 생성
EC2 페이지에 왼쪽에 NETWORK & SECURITY 아래 Load Balancers를 클릭한다.

Load Balancer
Create Load Balancer 버튼을 클릭한다.

Define Load Balancer
로드 밸런서의 기본 설정을 수행한다. 각 항목은 아래와 같다.
- Load Balancer name : 로드 밸런서의 이름이다.
- Create LB Inside : 로드 밸런서가 생성될 VPC를 지정한다.
- Create an internal load balancer : 공인 IP주소 없이 로드 밸런서를 생성하여 인터넷에 연결되지 않는 내부 로드 밸런서를 사용할 수 있다.
- Enable advanced VPC configuration : VPC에 속한 서브넷을 선택한다. 체크하면 서브넷 선택이 가능하다.
- Listener Configuration : 로드 밸런서가 처리할 프로토콜과 포트번호이다. 위의 화면은 HTTP(80) 처리를 위한 설정이다.
설정이 완료되면 Continue 버튼을 클릭한다.

Configure Health Check
헬스 체크 기능과 관련된 설정을 수행한다. 로드 밸런서는 각 EC2의 정상 작동 상태를 확인하여 정상적으로 작동하고 있는 인스턴스만을 대상으로 요청을 분배한다. 설정과 관련된 항목은 아래와 같다.
- Ping Protocol : 헬스 체크를 수행 할 때 사용하는 프로토콜이다.
- Ping Port : 헬스 체크를 수행 할 때 사용하는 포트이다.
- Ping Path : 헬스 체크를 수행할 때 사용하는 경로이다. HTTP, HTTPS의 경우에만 설정이 가능하다.
- Reponse Timeout : 체크에 대한 응답 시간으로 해당 응답 시간내에 반응이 없다면 정상적이지 않은 인스턴스로 간주한다.
- Health Check Interval : 헬스 체크 주기이다.
- UnHealthy Threshold : 설정된 수만큼 체크에 실패하면 인스턴스가 중단된 것으로 간주한다.
- Healthy Threshold : 설정된 수만큼 체크에 성공하면 비정상 인스턴스에서 정상 인스턴스로 인식한다.
설정이 완료되었다면 Continue 버튼을 클릭한다.

Security Group 설정
새로운 Security Group을 만들거나 기존에 사용되고 있던 Security Group을 선택한다. 80포트에 대한 접근과 요청 처리를 수행할 것이므로 HTTP(80) Rule을 추가한다.
설정이 완료되면 Continue 버튼을 클릭한다.

연결될 인스턴스 선택
로드 밸런서에 연결될 EC2 인스턴스를 선택한다. 본 포스팅에서는 2대의 EC2 인스턴스를 대상으로 로드 밸런싱을 수행할 것이므로 두대의 EC2 인스턴스를 선택한다. Enable Cross-Zone Load Balancing옵션을 이용하여 여러 AZ의 EC2 인스턴스로 부하를 분산할 수 있다.
설정이 완료되면 Continue 버튼을 클릭한다.

Add Tags
태그와 관련된 설정이다. 딱히 설정할 게 없으므로 Continue 버튼을 클릭한다.

설정 확인
마지막으로 설정을 다시 한번 확인한다. 확인이 완료되면 Create 버튼을 클릭한다.

생성된 로드 밸런서
앞으로는 EC2 인스턴스에 바로 접근하는 것이 아니라 위의 DNS Name에 지정된 주소로 요청한다.
4. 테스트
생성된 인스턴스 내부에 HTTP 서비스를 일단 제공해야 한다. 많은 방법이 있지만 nodejs를 이용하는 방법이 제일 간단하므로 nodejs로 해보자.
일단 nodejs를 설치한다. 기본적으로 CentOS에서는 yum으로 nodejs를 설치할 수는 없으므로 다음 명령을 수행하고 yum으로 설치한다.
# curl -sL https://rpm.nodesource.com/setup | bash –
#yum install nodejs
nodejs가 설치가 완료되면 다음과 같은 코드를 각 인스턴스에 작성하고 app.js라는 이름으로 저장한다. express 모듈을 이용하여 라우트할 수도 있지만 아래와 같이 해도 모든 80포트 요청에 대해 성공한다.
1 2 3 4 5 6 7 | var http = require( "http" ); http.createServer( function (request, response) { response.writeHead(200, { "Content-Type" : "text/html" }); response.write( "Hello ELB - 1" ); response.end(); }).listen(80); |
다른 인스턴스에도 위에서 숫자만 변경하고 같은 코드를 작성한다.
작성이 완료되면 실행한다.
# sudo node app.js

접근 실패
로드 밸런서를 만들고 바로 접근을 해보면 위와 같이 접근에 실패한다.

OutOfService
로드 밸런서를 상세히 보면 Instances 탭에 모든 인스턴스의 상태가 OutOfService 인 것을 확인할 수 있는데 이는 아직 헬스 체크가 모두 완료되지 않았기 때문이다. 위의 헬스 체크 관련 설정에서 Interval을 30초로 Healthy Threshold가 10번으로 설정되었기 때문에 300초를 기다려야 한다.

InService
300초 후에는 위와 같이 InService 상태이다. InService 상태가 되고 접근을 다시 해보면 정상적으로 작동하는 것을 확인할 수 있다.

정상 작동중인 로드 밸런서
5. Sticky Session
ELB의 로드 밸런서는 기본적으로 라운드 로빈 알고리즘을 이용하여 요청 분배 작업을 한다. 하지만 Sticky Session 기능을 이용하면 사용자의 쿠키 세션을 이용하여 요청 분배 작업을 수행하므로 사용자가 처음 접속했던 EC2 인스턴스로 계속 연결 시켜준다.

Sticky Session
로드 밸런서를 선택하고 Description 탭을 확인해 보면 Port Configuration에 Stickiness가 Disabled 상태로 되어 있는 것을 볼 수 있다. 오른쪽에 Edit 링크를 클릭한다.

상세 설정
Sticky Session 기능을 사용하지 않겠다는 제일 위의 라디오 박스 아래로 2개의 라디오 박스가 있다. 두번째 라디오 박스는 로드 밸런서가 생성한 쿠키를 이용하고 세번째 라디오 박스는 어플리케이션이 생성한 쿠키를 사용한다. 두번째 라디오 박스를 선택하면 Expiration Period라는 쿠키 유지 시간을 초단위로 설정할 수 있으며 세번째 라디오 박스를 선택시 쿠키의 이름을 입력할 수 있다.
설정이 완료되면 Save 버튼을 클릭한다.

Sticky Session 설정 후
설정 전과 다르게 쿠키에 대한 설정 상태를 확인할 수 있다.