AWS의 로드 밸런싱 기능을 알아보고 기능을 이용한 서비스 구현을 간단히 실습해본다.
로드밸런싱
서버에 사용자가 몰리면 서버는 모든 사용자에게 일관성 있는 서비스를 제공하기 어려워진다.
이 경우 우리는 여러 대의 서버를 구축해서 운영해야 한다.
그러나 단순히 서버를 늘린다고 해도 서버에 사용자를 균등하게 분산해주지 않으면 한 서버에 트래픽이 몰릴 수 있다.
로드 밸런싱은 트래픽을 여러 대의 서버에 분산함으로 써 서버의 과부하를 해소한다.
만일 서버 하나가 고장나더라도 로드 밸런서가 다른 서버로 접근하게 하여 가용성을 보장한다.
사용자 입장에서는 하나의 서버로 보이지만 사실 다수의 서버가 번갈아가면서 사용자에게 응답을 준다.
로드 밸런서에는 서버의 상태를 체크하는 Health Check 기능이 있다.
부하 분산 방식
Round Robin ( 순차 분배 )
서버에 들어온 요청을 순서대로 분배하는 방식이다.
여러 대의 서버가 동일한 스펙을 가질 경우 공평한 방식이다.
Weighted Round Robine ( 가중치를 고려한 순차 분배 )
서버 별로 가중치를 적용한 뒤 순서대로 분배하는 방식이다.
가중치가 클수록 더 많은 요청을 받을 수 있다.
서버들의 스펙의 차이가 있을 경우 적절한 방식이다.
Least Response Time ( 최소 응답 시간 우선 분배 )
로드밸런서가 서버들의 응답시간을 주기적으로 체크하여 가장 빠른 서버에 우선 분배하는 방식이다.
Least Connection ( 최소 연결 우선 분배 )
요청 시점에서 연결된 사용자가 가장 적은 서버에 분배하는 방식이다.
서버가 세션을 항상 길게 사용하는 경우 적절한 방식이다.
Hash Function을 활용하는 방법
클라이언트의 IP, Port 등을 고려하여 Hash를 계산 후 특정 서버로 매핑하여 처리하는 방식이다.
같은 사용자는 항상 동일한 서버로 연결된다. [ Sticky Session ]
부하 분산이 제대로 되지 않을 수 있는 단점이 있다.
AWS Load Balancer
AWS에서 지원하는 로드밸런서에는 크게 두 가지로 구분된다.
Application Load Balancer(ALB)
L7 계층의 로드밸런서
URL, HTTP 헤더 등을 따라 부하를 분산
Round Robin 방식을 지원
SSL 적용이 가능하다.
Network Load Balancer(NLB)
L4 계층의 로드밸런서
IP + Port 등을 따라 부하를 분산
Hash Function을 이용한 sticky Session 지원
EIP를 이용해 고정 IP 부여 및 DNS 설정 가능
EIP(Elastic IP Address, 탄력적 IP 주소)
탄력적이라는 것은 변하지 않는다는 의미로 고정 IP라는 뜻이다.
공공 IP를 할당받아 사용할 수 있는 서비스이다.
차이점
ALB
L7 계층이므로 프로토콜 별 다른 경로로 지정하는 등 더 섬세한 라우팅이 가능하다.
인증서를 로드밸런서와 공유하기 때문에 보안 상 위험성이 있을 수 있다.
NLB
L4계층이므로 데이터 내용은 보지 않아 ALB보다 속도가 빠르고 효율적이다.
ALB보다 가격이 저렴하다.
실습
Network Load Balancer를 이용하여 웹 서비스 구축하는 실습을 진행해본다.
사용되는 기능은 VPC, EC2를 이용하며 기초적인 생성 방법에 대해서는 다루지 않기 때문에 이전 글을 참고한다.
2022.10.17 - [보안 이론/클라우드 보안] - AWS - VPC(Virtual Private Cloud)
2022.10.19 - [보안 이론/클라우드 보안] - AWS - Amazon Linux로 WordPress 웹 서버 구축
아키텍처 설명
1. 클라이언트는 인터넷 게이트웨이를 통해 VPC에 접근한다.
2. 인터넷 게이트웨이에서는에서는 EIP가 지정된 Network Load balancer를 접근한다.
3. 동일한 웹 서버를 두 개 생성하여 private subnet 01에 둔다.
4. 외부에서 접속할 수 없는 private 웹 서버를 NLB를 통해 접근한다.
5. public에 bastion host를 통해 private 웹 서버를 관리 목적으로 접근할 수 있다.
6. NLB에 계속 접근하면 부하에 따라 web1과 web2가 번갈아가면서 나온다.
Bastion Host
프라이빗 서브넷의 리소스에 대해 접근이 허용된 호스트로 퍼블릭 서브넷에 구성한다.
관리자만 접근 가능하도록 구성하며 내부에 접근 시 bastion을 경유하여 안전하게 접속한다.
EC2 생성
AMI 생성
먼저 이미지를 생성하기 위한 EC2 인스턴스를 퍼블릭으로 설정 후 OS는 우분투를 설정하여 생성한다.
생성이 완료되면 SSH 접속 후 다음과 같은 과정을 진행한다.
sudo apt update
sudo apt install apache2
cd /var/www/html
sudo rm index.html
sudo vim index.html
index.html 파일에는 다음과 같이 채워준다.
<body style="background-color:red">
<meta charset="utf-8" />
<h1> 1번 웹 서버 </h1>
</body>
구성이 완료되면 해당 EC2를 이미지화시킬 것이다.
생성한 EC2를 오른쪽 클릭하여 다음과 같이 이미지 생성을 눌러준다. 생성 시 이름 설정 후 기본값으로 진행한다.
Bastion host 생성
이미지가 생성되는 동안 우리는 Bastion Host를 퍼블릭 서브넷에 생성한다.
bastion host는 뒤에 만들 프라이빗 웹서버에 접근하기 위한 호스트로 보안 그룹을 이용해 접근을 통제할 것이다.
OS는 우분투를 이용하며 public subnet 01에 생성한다.
보안 그룹은 SSH를 호스트 IP에서만 접근 가능하도록 설정할 것이다.
AMI를 이용해 프라이빗 웹 서버 생성
이미지 생성이 완료되면 이미지를 이용해 private-subnet01에 인스턴스를 2개 생성한다.
보안 그룹에서 SSH 허용 주소를 Bastion의 프라이빗 주소로 변경하여 접근을 제한한다.
Bastion에서 프라이빗 웹 서버 접근
bastion에서 방금 생성한 프라이빗 웹 서버에 접근하기 위해서는 키페어가 필요하다.
키페어를 호스트에서 bastion으로 옮기기 위해서는 ssh기반의 scp 명령어를 이용한다.
명령어 사용 시 pem 파일이 있는 위치에서 진행해야 한다.
scp -i [ec2 접근 키] [업로드 파일] [ec2 연결 계정@ec2 주소]:[ec2 내부 경로]
예시) scp -i bastion.pem pvt_key.pem ubuntu@ec2-1-111-11-111.us-east-2.compute.amazonaws.com:~/
# 키 업로드 후 권한 설정
# 400으로 설정하지 않으면 연결 시 오류가 발생한다.
chmod 400 pvt_key.pem
성공 시 다음과 같이 home 디렉토리에 키파일이 올라간 것을 확인할 수 있다.
이제 해당 키를 통해 프라이빗 웹서버에 SSH 접근이 가능하다.
두 번째 서버에 접근하여 index.html 파일의 배경색을 파란색으로 수정한 뒤 저장한다.
이 작업은 실습 간에 로드밸런싱이 동작하는지 확인하기 위함이다.
EIP 발급
로드밸런서에 고정 IP를 지정하기 위해 먼저 EIP를 발급받아야 한다.
EC2의 사이드 바에서 탄력적 IP를 누르고 탄력적 IP 주소 할당을 받는다.
할당 시에 설정할 값은 따로 없고 기본값으로 진행한다.
정상적으로 완료되면 위와 같이 공공 IP를 얻을 수 있다.
NLB 생성
이제 NLB를 생성하여 프라이빗 웹서버에 연결할 것이다.
EC2 사이드바에서 로드밸런서를 선택 후 생성을 진행한다.
우리는 NLB를 이용할 것이기 때문에 가운데에 있는 Network Load balancer를 선택한다.
로드밸런서 생성 페이지가 나오면 다음과 같이 진행한다.
Load balancer name
로드밸런서의 이름을 원하는 이름으로 설정한다. 실습에서는 tae-nlb로 설정하였다.
scheme
생성하는 로드밸런서는 인터넷에서 내부 vpc로 접근하기 때문에 internet-facing으로 설정한다.
Network mapping
자신의 VPC를 고르면 가용 영역을 선택할 수 있다.
선택 가능한 두 가용 영역을 선택 후 퍼블릭 서브넷을 선택한다.
public subnet 01의 IPv4 address를 Elastic IP로 설정하여 위에서 생성한 EIP를 부착한다.
로드밸런싱을 이용할 타겟 그룹을 설정한다. 현재 생성되지 않았으므로 Create target group 버튼을 눌러 생성을 진행한다.
EC2 인스턴스를 기준으로 설정하기 때문에 Instance를 클릭하고 이름을 설정한 뒤 다음으로 진행한다.
생성한 두 개의 프라이빗 웹 서버를 선택 후 Include as Pending below 버튼을 누른다.
아래와 같이 포함이 되었으면 타겟 그룹을 생성한다.
다시 로드밸런서 생성 페이지로 돌아와서 타겟 그룹 옆에 새로고침 버튼을 누른 뒤 설정한다.
이 밖에 설정들은 기본값으로 두고 생성을 진행한다.
생성이 완료되면 아래처럼 로드 밸런서의 상세 정보를 확인할 수 있으며 EIP가 적용된 것도 알 수 있다.
해당 EIP를 이용해 접속을 한 뒤 새로고침을 계속해서 누르면 두 가지 화면이 불규칙적으로 번갈아 나오며 로드밸런싱이 적용된 것을 확인할 수 있다.
새로 고침 할 때마다 규칙적으로 바뀌지 않는 이유는 NLB의 부하 분산 규칙이 라운드 로빈이 아니라는 뜻이다.
만약 ALB로 생성했다면 라운드 로빈이 적용되어 새로 고침 시마다 다른 서버로 연결될 것이다.
우리는 AWS의 로드밸런서를 이용하여 웹 서버에서 어떤 방식으로 부하를 분산하는지에 대해 알아보고 해당 기능을 적용한 웹서비스를 구축해보았다.
'보안 이론 > 클라우드 보안' 카테고리의 다른 글
Docker - 이론 및 기본 사용법 (0) | 2022.11.04 |
---|---|
AWS - Auto Scaling (0) | 2022.11.03 |
AWS - RDS 활용 3-Tier 구축 (0) | 2022.10.19 |
AWS - Amazon Linux로 WordPress 웹 서버 구축 (0) | 2022.10.19 |
AWS - VPC(Virtual Private Cloud) (0) | 2022.10.17 |