[AWS] 로드 밸런서

Ogu·2023년 4월 29일
0

AWS

목록 보기
4/5

이제 웹 서버 준비를 마쳤으나 아직 인터넷에 공개되지 않은 상태입니다. 로드밸런서를 이용해 브라우저에서 애플리케이션을 열람할 수 있도록 합니다.

로드 밸런서란?

사용자가 증가하면 1대의 웹 서버로는 요청들을을 감당하기 힘이 듭니다. 이럴 때는 웹 서버를 여러 대를 준비하여 성능을 높일 수 있습니다. 이런 방식을 스케일 아웃 이라고 부릅니다. 하지만 단순히 웹 서버만 늘리면 송신 대상지의 PC 브라우저나 모바일에서는 새로운 웹 서버를 자동으로 이용할 수 없습니다. 따라서 서비스를 제공하는 측에서 무언가의 시스템을 추가로 제공해야 합니다.

로드 밸런서의 역할

  • 요청 분산
    인터넷으로부터 전송된 요청을 여러 웹 서버에 균등하게 분산
  • SSL 처리
    송수신하는 데이터를 암호화하는 SSL(Secure Sockets Layer) 처리
    로드 밸런서에는 암호 관련 처리를 빠르게 수행하는 전용 시스템이 제공되므로 웹 서버에서 암호를 처리하는 것 보다 빠른 속도로 처리할 수 있습니다.
  • 부정 요청 대응
    로드 밸런서 없이 부정한 접근을 감지하여 방지하는 처리를 웹 서버에서 수행하면 높은 부하가 걸려 웹 서버 자체가 다운되거나 최악의 경우 웹 서버가 탈취될 가능성도 있습니다. 로드 밸런서는 이러한 부정한 접근에 대응하는 전용 시스템을 제공합니다.

AWS에서 제공하는 로드 밸런서

AWS에서는 ELB(Elastic Load Balancing)라는 서비스로 로드 밸런스를 제공합니다. ELB는 다음 세가지 로드 밸런서를 제공합니다.

  • Application Load BalanceR(ALB)
    HTTP나 HTTPS 접근에 특화되어 있으며, 웹사이트나 REST API를 제공하는 사이트에 적합합니다.
  • Network and Balancer
    다양한 통신에 대응할 수 있으며, 게임이나 채팅등의 용도에 사용합니다.
  • Classic Load Balancer
    앞의 두 로드 밸런서가 등장하기 전에 사용되었습니다. 최근에는 사용하는 경우가 거의 없습니다.

로드 밸런서를 이용한 요청 라우팅

실제로는 HTTP(포트 번호는 1024보다 큰 값)라는 조건을 이용해 로드 밸런서로부터 요청을 받습니다.
포트는 보통 관습적으로 정해져 있으며, 자바 언어 기반은 8080, 루비 언어 기반은 3000을 주로 이용합니다.

  • HTTPS를 HTTP로 변환하는 이유
    HTTPS를 이용한 통신의 암호 및 복호 처리를 웹 서버가 아니라 로드 밸런서에서 수행하기 때문입니다. 이렇게 하면 웹 서버의 부하와 인증서 등의 관리 비용을 줄일 수 있습니다.

  • 포트번호를 변환하는 이유
    웹 서버의 보안을 높이기 위해서 보통 1024 이상의 포트 번호를 이용해 일반 권한을 가진 사용자로 애플리케이션을 작동합니다. (0~1023까지의 포트번호는 root권한으로 작동하며, 부정적인 접근으로 빼앗긴다면 root 권한 역시 전달됩니다.)

로드 밸런서 생성

가용 영역

인터넷 게이트웨이로의 경로가 있는 서브넷을 지정해야 합니다.

로드 밸런서와 대상 그룹

로드 밸런서

어떤 프로토콜(HTTP/HTTPS 등)을 이용할 것인지와 같은 인터넷->로드 밸런서 접근과 관련한 설정을 합니다. 클라이언트로부터 처리를 받는 기능은 리스너라고 합니다.

대상 그룹

어떤 웹 서버에 요청을 분산 할 것인가와 같이 로드 밸런서 -> 웹 서버 접근과 관련한 설정을 합니다. 인터넷으로 부터의 접근을 조건에 따라 서로 다른 웹 서버에 분산시킬 수 있습니다.

생성 순서

유형 설정

웹 서버의 HTTP/HTTPS 통신에 특화된 ALB를 선택합니다.

로드 밸런서 기본 설정

로드 밸런서의 이름을 설정합니다. Scheme과 IPv4는 기본값으로 둡니다.

VPC와 가용 영역 설정

로드 밸런서와 VPC를 연결하는 설정입니다. VPC를 설정하고 퍼블릭 서브넷을 지정합니다.

보안 그룹 설정

기본 default 보안 그룹과 앞서 private 서브넷용으로 생성한 보안 그룹을 각각 선택합니다.

  • default : 로드 밸런서가 VPC 안의 리소스에 접근하도록 합니다.
  • fepe-sg-elb : 로드 밸런서가 인터넷으로부터의 HTTP/HTTPS 접근을 받도록 합니다.

리스너 및 라우팅 설정

지금은 HTTP 리스너만 설정합니다.
HTTPS 리스너는 후에 커스텀 도메인과 DNS 준비에서 SSL 서버 인증서 발행 시에 추가하도록 합니다.
기본적으로 HTTP 80포트에 대한 리스너가 제공되므로 이를 수정합니다.
먼저, 라우팅 대상 그룹을 생성합니다. '대상 그룹 설정' 을 클릭합니다.

대상 그룹 설정

기본 구성 카레고리에서는 생성할 대상 그룹의 기본 정보를 설정합니다. 이 설정은 한번 설정한 뒤 변경할 수 없습니다.

  1. 대상 유형으로 인스턴스를 선택하고, 대상 그룹 이름을 지정합니다.


  1. Protocol과 Port는 로드 밸런서에서 웹 서버에 연결할 때 이용하는 포트 번호를 입력합니다.

ex) 인터넷으로부터 접근할 때는 HTTPS로 포트 번호 443번으로 수행하지만, 로드 밸런서에서 복호화해 웹 서버에 접근할 때는 HTTP로 포트 번호 8080을 이용하는 것과 같은 설정을 할 수 있습니다.

  1. 대상 그룹에 포함시킬 VPC를 선택합니다.

  2. Protocol Version은 통신할 프로토콜에 맞는 버전을 선택합니다. 필자는 HTTP1을 선택했습니다.

  3. 상태 검사 항목에서는 로드 밸런서가 각 웹 서버의 작동 상황을 확인할 때 이용하는 경로를 지정합니다. 이 경로로 보내진 요청이 지정된 횟수만큼 실패하면 로드 밸런서는 해당 웹 서버로 보내지 않도록 자동으로 판단합니다. 기본값으로 두도록 합니다.

설정을 마치고 대상 등록(타깃 등록)으로 넘어갑니다.

타깃 등록
대상 그룹에 등록할 EC2 인스턴스를 선택한 후 아래에 보류 중인 것으로 포함항목을 클릭한 후 대상 그룹을 생성합니다.

타깃 그룹이 올바르게 등록되었음을 확인합니다.

다시 탭을 닫고 돌아와 '리스너 및 라우팅' 항목에서 HTTP, 80포트, 방금 생성한 타깃을 선택합니다.

모두 선택 후 아래의 로드 밸런서 생성 버튼을 클릭합니다.

이것으로 로드 밸런서를 생성했습니다. 팝업과 같이 로드 밸런서가 정상적으로 활성화 되기까지 몇 분이 소요될 수 있습니다.

작동 확인

로드 밸런서 생성으로 인터넷과 웹 서버가 연결되었습니다. 브라우저에서 작동을 확인해봅시다.

HTTP 요청 받을 준비

보통 아파치나 엔진엑스 등의 HTTP 서버 프로그램을 이용하지만, 여기서는 웹 서버를 생성할 때 이용한 Amazon Linux2에 미리 설치된 파이썬을 이용해 준비합니다.

파워쉘을 2개 실행해 각각의 웹서버 web01과 web02에 ssh로 연결합니다.

이제 다음 작업을 수행합니다.

1. index.html 생성

2. 파이썬으로 HTTP 서버 가동

$ python -m SimpleHTTPServer 8080

요청 라우팅 확인

여기까지 진행했더라도 로드 밸런서는 곧바로 요청 라우팅을 하지 않습니다. 수 차례 서버에 헬스 체크를 수행하고, 해당 요청들이 모두 성공하면 요청을 라우팅합니다. 이제 EC2 대시보드의 '대상 그룹'에서 확인해봅시다.

상태 확인의 상태가 healthy로 바뀌면 대상 웹 서버로 요청이 라우팅됩니다. 웹 서버 가동 후 healty로 바뀌기 까지 약간의 시간이 소요될 수 있습니다.

브라우저에서 확인하기

이제 로드 밸런서에 접근할 준비를 마쳤습니다.
브라우저를 통해 확인해봅시다.
로드밸런서에 외부에서 접근하기 위한 도메인 이름은 로드밸런서의 설정 화면에서 확인할 수 있습니다.

브라우저에서 해당 도메인으로 들어가봅시다.

Ctrl + C를 눌러 파이썬 프로그램을 종료합니다.

profile
私はゲームと日本が好きなBackend Developer志望生のOguです🐤🐤

0개의 댓글