ALB(Application Load Balancer)에서 URL 기반 라우팅
💡 Intro
하나의 도메인에 두 개의 서비스를 할 수 있는지에 대해 묻는 분이 있었습니다. AWS에서 어떻게 구성해야 하는지 🌎AWS Docs를 찾아보다가 ALB(Application Load Balancer)로 가능하다는 것을알게 되었습니다. 이를 URL 기반 라우팅이라고 하는데, 이에 대해서 실습해 보려 합니다.
⚠️ Classic Load Balancer, Network Load Balancer 및 Gateway Load Balancer 등 다른 로드 밸런서 유형에는 이 기능을 사용할 수 없습니다. ELB는 AWS를 사용하는 분에게는 기본적으로 숙지해야하는 내용이라고 들었기 때문에 초보 개발자인 저도 열심히 공부하고 있습니다.😭
🔎 ALB(Application Load Balancer)란?
ELB(Elastic Load Balancing) 설명서에는 ALB(Application Load Balancer)에 대해 이렇게 설명 하고 있습니다.
Application Load Balancer는 개방형 시스템 간 상호 연결(OSI) 모델의 일곱 번째 계층인 애플리케이션 계층에서 작동합니다. 로드 밸런서는 요청을 받으면 우선 순위에 따라 리스너 규칙을 평가하여 적용할 규칙을 결정한 다음, 규칙 작업의 대상 그룹에서 대상을 선택합니다. 애플리케이션 트래픽의 콘텐츠를 기반으로 다른 대상 그룹에 요청을 라우팅하도록 리스너 규칙을 구성할 수 있습니다. 대상이 여러 개의 대상 그룹에 등록이 된 경우에도 각 대상 그룹에 대해 독립적으로 라우팅이 수행됩니다. 대상 그룹 레벨에서 사용되는 라우팅 알고리즘을 구성할 수 있습니다. 기본 라우팅 알고리즘은 라운드 로빈입니다. 그 대신 최소 미해결 요청 라우팅 알고리즘을 지정할 수 있습니다.
- 출처: AWS Docs
Application layer는 OSI 7 Layer의 제일 꼭대기에 있는 계층입니다. 애플리케이션과 데이터를 주고 받기 위한 역할을 하는데, 서버가 이해할 수 있는 메시지(데이터)로 변환하고, 전송 계층에 전달하는 역할을 수행합니다. 애플리케이션 계층에는 웹 사이트를 이용할 때의 HTTP 프로토콜, 파일을 전송할 때 쓰는 FTP 프로포콜, 메일을 보낼 때 쓰는 SMTP 프로토콜 등 다양한 프로토콜이 존재합니다.
아래 이미지와 같이 Load Balancer 아래에는 Listener, Rule, Target Group이 있습니다.
- Listener : 구성한 프로토콜 및 포트를 사용하여 클라이언트의 연결 요청을 확인하여 요청을 처리할 적절한 Target Group으로 전달합니다.
- Rule : 어떤 대상그룹에 전달해야 할지를 판단하는 기준이 됩니다.
- Target Group : 클라이언트의 요청을 처리할 EC2 인스턴스의 집합이며, 지정한 프로토콜과 포트 번호를 사용하여 요청을 라우팅합니다.
이미지 1. ALB 구성 요소(출처: AWS Docs)
ALB는 하나 이상의 Listener를 추가할 수 있으며, Listener에는 다수의 Rule을 가질 수 있고, Listener 또한 다수의 Target Group을 가질 수 있습니다.
📚 ALB에서 URL 기반 라우팅을 수행해 보기
AWS Docs를 따라서 진행해 보겠습니다.
서비스 A와 서비스 B라는 두 가지 서비스가 있고 애플리케이션이 포트 80의 이러한 서비스에서 실행되고 있다고 가정합니다. 예를 들어 서비스 A는 /svcA 경로에서 애플리케이션을 실행하고, 서비스 B는 /svcB 경로에서 애플리케이션을 실행합니다.
- 출처: AWS Docs
📕 ELB(Application Load Balancer) 생성
[EC2 대시보드]에서 [로드 벨런서]를 들어간 뒤 [로드 밸런서 생성]을 들어갑니다.
이미지 2. 로드 밸런서 생성
[Select load balancer type]에서 [Application Load Balancer]를 Create합니다.
이미지 3. Application Load Balancer 생성 - 1
Load balancer name, VPC, 가용영역을 설정한 후 Summary를 확인하고 생성합니다.
이미지 4. Application Load Balancer 생성 - 2
Internet-facing(인터넷경계) 란, 이름에서 느껴지는 것처럼 인터넷에 연결되는 밸런서를 뜻합니다. 인터넷으로부터 요청을 받아서 각기 다른 EC2로 분배해 주는 역할을 합니다. Internal(내부) 는, private subnet에 연결되어 있는 여러 서버에 연결될 때 사용합니다.
이미지 5. Application Load Balancer 생성 - 3
로드 밸런서 [my-alb]가 생성된 것을 볼 수 있습니다.
이미지 6. Application Load Balancer 생성 - 4
📘 Listeners 규칙 구성
리스너 규칙 1: 요청 URL 경로에 /svcA 문자열이 포함되어 있으면 요청을 my-tg1로 전달합니다. my-tg1에는 지정된 경로에서 애플리케이션을 실행하는 서비스 A가 포함되어 있기 때문입니다. 리스너 규칙 2: 요청 URL 경로에 /svcB 문자열이 포함되어 있으면 해당 요청을 my-tg2로 전달합니다. my-tg2에는 지정된 경로에서 애플리케이션을 실행하는 서비스 B가 포함되어 있기 때문입니다.
- 출처: AWS Docs
[로드 밸런서]를 선택한 다음 [리스너(Listeners)]를 선택합니다. 그리고 리스너를 업데이트하기 위해 [규칙 보기/편집(View/edit rules)]을 선택합니다.
이미지 7. 리스너 규칙 보기/편집
상단의 메뉴에서 규칙 추가(Add rules) 아이콘인 [더하기 기호(+)]를 선택합니다.
이미지 8. 리스너 규칙 추가 - 1
- 우선 순위에 따라 규칙을 삽입할 수 있는 [규칙 삽입(Insert Rule) 아이콘]을 클릭합니다.
- /svcA와 /svcB에 경로 기반 규칙 추가를 위해 IF(모두 일치) 부분에서 [조건 추가(Add condition)]를 클릭 후, [경로(Path)]를 선택한 다음 경로 패턴 /svcA를 입력합니다.
- THEN 부분에서 [작업 추가(Add action)]를 클릭한 후, [전달(Forward to)]을 선택한 다음 대상 그룹 my-tg1를 선택합니다.
- /svcB 또한 똑같이 설정해 줍니다.
이미지 9. 리스너 규칙 추가 - 2
Application Load Balancer의 DNS 이름을 복사하여 URL 경로 끝에 /svcA or /svcA 를 붙여 넣었을 때, 올바른 서비스를 반환하면 테스트가 성공적으로 이루어집니다.
[참고자료]