Application Load Balancer(ALB) 사용하기

redwood
8 min readFeb 15, 2019

--

이번 블로그에서는 Application Load Balancer (ALB)를 사용해 Web 서버를 구성해보도록 하겠습니다.

Application Load Balancer 테스트 구성도

테스트에 대한 설명

  • ALB는 Public Subnet에, Web 서버는 Private Subnet에 생성합니다.
  • Web 서버에서 인터넷 통신은 NAT Gateway를 통해서 함
  • VPC, Subnet, Security Group 및 Route Table 설정은 이전 블로그에서 만든 것을 그대로 사용 (일부 설정은 변경 필요)

Web#1 EC2 생성하기

MyVPC 에 있는 PrivateSubnet-2a에 테스트용 Web#1 서버를 생성합니다.

User Data에 아래의 스크립트를 추가하여 웹서버를 설치하고 index.html 파일을 만듭니다.

#!/bin/bash
yum install httpd -y
service httpd start
echo "Web#1 Server - index.html" > /var/www/html/index.html

Web#2 EC2 생성하기

MyVPC 에 있는 PrivateSubnet-2c에 테스트용 Web#2 서버를 생성합니다.

User Data에 다음과 같이 입력합니다.

#!/bin/bash
yum install httpd -y
service httpd start
echo "Web#2 Server - index.html" > /var/www/html/index.html

Application Load Balancer 생성하기

AWS에서는 Application Load Balancer와 Network Load Balancer를 제공합니다. 이번 테스트에서는 ALB를 사용하겠습니다. 참고로, ALB은 EC2 서비스에서 생성할 수 있습니다.

ALB는 L7 Switch이고, NLB는 L4 Switch입니다. ALB는 Layer 7 프로토콜을 이해할 수 있어 HTTP 프로토콜을 이해하여 로드 분산을 할 수 있습니다.
예를들면, http://seungbeom.me/*.jpg 와 같은 이미지 파일에 대한 요청을 이미지 전용 웹서버로 전송한다든지. http://seungbeom.me/ksr?session_id=xxxxx와 같이, 요청에 대해 같은 세션 ID의 요청을 같은 서버로 전달하도록 설정을 할 수도 있습니다.

Application Load Balancer 선택

외부에서 ALB로 접속을 해야 하므로 Public Subnet에 Load Balancer를 구성합니다. 아래와 같이 PublicSubnet-2a와 PublicSubnet-2c 를 선택합니다.

Step 1: Configure Load Balancer

(1) Name : Web-ALB
(2) Scheme : internet-facing
(3) Listeners : HTTP 80 port, HTTPS 443 port
(4) Availability Zones
— MyVPC의 PublicSubnet-2a
— MyVPC의 PublicSubnet-2c

HTTPS만 서비스할 경우에는 HTTP 80 port를 선택할 필요는 없습니다. 여기서는 테스트 목적으로 HTTP, HTTPS를 모두 선택하였습니다.

Step 2: Configure Security Settings

Certificate type과 Security Policy는 default 값을 사용하겠습니다. 선택할 수 있는 값에 자세한 내용은 AWS 문서를 참고하시기 바랍니다.

AWS Certificate Manager에서 SSL/TLS 인증서 생성하기

Configure Security Settings 단계에서 선택할 인증서를 먼저 생성해야 합니다. AWS Certificate Manager을 사용하면 ALB에 SSL/TLS 인증서를 손쉽게 설치할 수 있습니다.

아래와 같이 등록할 도메인명을 등록합니다.

SSL/TLS 인증서 (X.509) 신청화면

Validation 방법을 Email로 선택합니다.

인증 선택 화면

입력한 값을 확인 후 Confirm and request를 해줍니다.

최종 확인

이메일 확인을 하기 전이라 Pending validation으로 나옵니다.

그런데 메일이 오지 않네요. 원인을 찾지 못해서 DNS 인증으로 변경해 다시 신청하였습니다.

DNS Validation 을 위한 CNAME 레코드 생성 화면

DNS 인증을 하면 Route 53에 CNAME 레코드를 생성해야 하는데, Route 53에서 직접 할 필요 없이 “Create record in Route 53” 버튼을 눌러 CNAME을 생성해줍니다.

The DNS record was written to your Route 53 hosted zone. It can take 30 minutes or longer for the changes to propagate and for AWS to validate the domain and issue the certificate.

DNS Validation 완료 화면

Application Load Balancer 생성하기 — Continued

이어서 진행하면, 앞에서 만든 Certificate name을 선택합니다.

Step 2: Configure Security Settings 화면

ALB가 사용할 Security Group을 생성하겠습니다. 이 단계에서는 ALB에서 허용한 네트워크 Port를 Security Group에서도 같이 열어주어야 합니다. 즉, ALB에 HTTP, HTTPS 접속이 가능하므로 아래와 같이 Security Group에서도 접속할 수 있도록 설정합니다.

Step 3: Configure Security Groups 화면

Step 4에서는 ALB가 Routing할 target group을 생성합니다.

  • Name : ALB-TG
  • Protocol : HTTP, Port : 80

Protocol을 HTTP로 하는 이유는 SSL/TLS 기능을 ALB에 Offloading 시켰으므로, ALB와 Web 구간에 HTTPS를 사용할 필요가 없습니다.

Step 4: Configure Routing 화면

따라서, Step 5에서는 Target group에 EC2 Instance 2개를 80 Port로 등록합니다. 아래 그림은 443으로 되어 있는데 80으로 수정되어야 합니다.

Route 53에 도메인 등록

앞에서 도메인 seungbeom.me로 SSL/TLS 인증서를 발급받았습니다. 이 도메인을 Route 53에 등록해서 Load Balancer DNS로 연결하도록 하겠습니다.

Route 53 레코드 등록 화면
  • Record Name : seungbeom.me
  • Record Value : dualstack.web-alb-331054211.ap-northeast-2.elb.amazonaws.com.
  • Record Type : A 레코드 (Alias)

DNS에 도메인 등록 후 웹브라우저에서 https://seungbeom.me으로 접속을 여러 번 시도해보면 부하가 두 Web 서버로 분산되는 것을 확인할 수 있습니다.

Web #1 접속
Web #2 접속

--

--