사용자가 많아지면 1대의 웹서버로는 트래픽을 감당할 수 없다. 이런 경우에 웹 서버의 개수를 늘려 문제를 해결할 수 있다.
그렇다면 인터넷에서 들어온 요청을 여러대의 웹서버에 연결시켜주는 역할을 누가할까? 그렇다. 로드밸런서가 한다.
Scale Up과 Scale Out
- Scale Up = 수직 스케일링(Vertical Scaling)
기존의 서버의 사양을 높여 성능을 업그레이드 하는 것
ex. 디스크 추가, CPU, 메모리 업그레이드
ex. EC2의 인스턴스 사양을 micro에서 medium으로 업그레이드
- Scale Out = 수평 스케일링(Horizonal Scaling)
장비의 개수를 늘려 성능을 업그레이드하는 것
ex. 클라우드 서비스의 auto scaling
인터넷으로부터 들어온 요청을 여러대의 웹 서버에 균등하게 분산한다.
안전하게 정보를 송수신하기 위해 사용하는 HTTPS라는 프로토콜에서 SSL(Secure Socket Layer)을 이용한다.
브라우저와 서비스 사이에서 오고가는 데이터 패킷은 암호 화 및 복호화되어 송수신된다. 그런데, 복잡한 계산인 암호화 및 복호화까지 웹서버에서 담당한다면, 웹서버에 부하가 걸려 제 성능을 다하지 못할 수 있다.
따라서, SSL 처리는 웹서버 대신 로드밸런서가 처리해주는 것이다.
부정요청 대응 또한, 웹서버에서 할 수도 있지만, 웹서버가 제 성능을 다 할 수 있도록 부정요청 처리는 로드밸런서에서 한다.
로드밸런서에는 부정한 접근에 대응하는 전용시스템이 제공된다.
-> AWS의 WAF(Web Application Firewall)인듯하다.
또한, 여러대의 개별 웹서버에서 부정요청 대응에 대한 대책을 마련하는 것보다 여러대의 웹서버 앞단에 위치한 로드밸런서에서 대책을 마련하는 것이 더 관리 point가 줄어든다.
외부로부터 요청받은 특정 프로토콜과 포트번호 조합을, 내부의 웹서버가 받는 프로토콜과 포트 번호로 변환하는 작업을 로드밸런서가 수행한다. 이 작업을 요청 라우팅이라고 한다.
리눅스 등의 OS에서는 0~1023까지의 포트 번호로 데이터를 받으려면 root 권한을 가진 사용자로 프로그램을 작동해야한다.
만약! 악의적인 사용자에게 프로그램을 빼앗길 경우, 해당 root 권한 또한 빼앗기는 셈이 된다.
따라서 로드 밸런서 내부에 있는 웹서버는 보통 1024 이상의 포트번호를 이용해 일반 권한을 가진 사용자로 애플리케이션을 작동한다.
보통 자바언어 기반 프로그램은 8080, 루비언어 기반은 3000을 사용한다고 한다.
해당 요청을 어떤 웹서버(EC2)혹은 웹서버들에게 보낼 것인지 그룹핑한 것
input으로 들어온 프로토콜과 포트번호를 어떤 프로토콜과 포트번호로 라우팅하여 output으로 보낼지 rule을 설정한다.
ALB의 경우, 특정 url로 들어온 요청에 대해서 특정 대상그룹으로 요청을 세밀하게 라우팅할 수 있다.
dev
와 prod
으로 배포환경을 2개로 분리하고 있다.
따라서 dev EC2
가 속한 dev target group
, prod EC2
가 속한 prod target group
총 2개를 생성했다.
또한, 서브도메인으로 dev, prod에 대한 target group 접근을 구분하고 있다.
즉, dev-api.snackexercise.com
은 dev target 그룹
으로, api.snackexercise.com
은 prod target 그룹
으로 라우팅 되도록 RULE을 설정했다.
또한, https
로 들어온 요청은 http
로 라우팅되도록 RULE을 설정하였다.