[NCP] LoadBalancer Path Pattern

ALB Path Pattern 리스너 규칙이란?

Application Load Balancer(ALB)의 Path Pattern 규칙은, ALB가 들어오는 요청의 URL 경로(Path)를 기준으로 요청을 서로 다른 대상(Target Group)으로 라우팅할 수 있도록 해주는 기능이다. 주로 웹 애플리케이션에서 요청 경로에 따라 서로 다른 백엔드 서비스로 트래픽을 분기하고자 할 때 사용된다. ALB 리스너 규칙에는 이 외에도 Host Header, HTTP Header, Query String 등 다양한 조건이 있지만, 그 중에서도 Path Pattern은 가장 널리 사용되는 방식 중 하나이다.

실습 진행 순서

  1. Server에 Nginx 컨테이너 생성 및 배포(각각 3000포트, 8000포트 두개를 띄우도록 하겠다.)
  2. ALB x1, Target Group x 2(3000포트, 8000포트) 생성 & ALB 리스너 규칙 수정
  3. ALB주소를 A레코드로 Global DNS 도메인 매핑
  4. 도메인 주소 접속을 통한 Path Pattern 설정 확인

실습 환경 준비

  1. VPC/Subnet/Server x1생성
  2. 가비아에서 구매한 도메인 Global DNS에 매핑

사전준비
사전에 VPC, Subnet, 서버 한 대(Server x1), 그리고 Global DNS에 가비아 도메인이 매핑되어 있어야 실습을 진행할 수 있다.

1. Server에 Nginx 컨테이너 생성 및 배포

Ubuntu 20.04 기반의 서버에서 각각 3000번 포트와 8000번 포트에 Nginx 컨테이너 두 개를 실행할 예정이다. 이를 위해 Docker와 Docker Compose를 설치하고, Docker Compose 파일을 사용해 Nginx 컨테이너들을 간편하게 배포하고자 한다.

1.1 Docker 설치

1. 패키지 업데이트

sudo apt-get update

2. 종속되는 패키지 설치

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

3. Docker GPG키 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4. Docker의 apt 저장소를 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

5. 시스템 패키지 업데이트

sudo apt-get update

6. Docker 설치

sudo apt-get install docker-ce docker-ce-cli containerd.io

7. Docker가 설치 확인

sudo systemctl status docker
sudo docker run hello-world

8. docker-compose 설치

sudo apt install docker-compose
docker-compose --version

1.2 Docker-compose.yml 파일 작성

version: '3.3'

services:
  red:
    image: nginx:latest
    container_name: nginx8000
    ports:
      - "8000:80" 
    volumes:
      - ./nginx8000/index.html:/usr/share/nginx/html/index.html
    networks:
      - nginx_net

  blue:
    image: nginx:latest
    container_name: nginx3000
    ports:
      - "3000:80"  
    volumes:
      - ./nginx3000/index.html:/usr/share/nginx/html/index.html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - nginx_net

networks:
  nginx_net:
    driver: bridge

nginx를각각 8000번, 3000번 포트로 설정해줄 것이다. 

1.3 nginx.conf 파일 작성

server {
    listen 80;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }

    location /nginx3000 {
        alias /usr/share/nginx/html/;
        index index.html;
    }
}

추후 로드밸런서 path pattern 경로를 /nginx3000으로 설정해줄 것이기때문에 location경로를 /nginx3000으로 설정해준다.

1.4 nginx3000/index.html, nginx8000/index.html 파일 작성
nginx3000/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Nginx 3000</title>
</head>
<body>
    <h1>Hello from Nginx on port 3000!</h1>
</body>
</html>

nginx8000/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Nginx 8000</title>
</head>
<body>
    <h1>Hello from Nginx on port 8000!</h1>
</body>
</html>

1.5 구축한 컨테이너 폴더 확인

├── docker-compose.yml
├── nginx3000
│   └── index.html
├── nginx8000
│   └── index.html
└── nginx.conf

1.6 컨테이너 이미지 빌드

root@test2:~/project# docker-compose up -d --build
Creating network "project_nginx_net" with driver "bridge"

Creating nginx8000 ... done
Creating nginx3000 ... done
root@test2:~/project# 
root@test2:~/project# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
12b98a7a11ee   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:3000->80/tcp   nginx3000
f37c77dcb75d   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:8000->80/tcp   nginx8000
root@test2:~/project# 

보시면 각각 컨테이너가 정상으로 8000포트와 3000포트로 매핑된모습을 볼수 있다. 

2. ALB x1, Target Group x 2(3000포트, 8000포트) 생성 및 리스너 규칙 수정

2.1 3000포트 타겟그룹 생성

2.2 8000포트 타겟그룹 생성

타겟그룹을 각각 생성하였으면 우선 ALB에 8000포트 타겟그룹만 매핑해주겠다.. (ALB와 타겟그룹을 생성하는 자세한 장면은 생략하도록 하겠다. 

2.3 생성한 ALB 리스너 설정 변경
리스너 설정 변경 -> 규칙 조회/변경으로 들어가서 3000포트 컨테이너에 대한Path Pattern 에 대한 리스너 규칙을 추가하도록 하겠다. 

규칙 조회에서 이제 3000번 포트 타겟그룹을 Path Pattern 방식으로 지정해준다. 

미리 nginx.conf 파일에서 loacation을 /nginx3000으로 지정해두었기 때문에 3000번포트 경로를 /nginx3000*로 지정해준다 그에 따른 타겟그룹은 좀 전에 생성해준 3000번포트를 대상으로 한 타겟그룹으로 설정해준다. 

3. ALB 도메인 매핑

다음과 같이 ALB주소를 A레코드를 통해 DNS에 매핑해준다.. (가비아에서 구매한 도메인을 Global DNS에 매핑하는 방법은 사전준비참고자료를 참고해주시면 된다.)

4. 도메인 주소를 통한 확인

현재 제가 등록한 도메인은 nuxschool.online이다.
기본경로는 8000포트를 이용한 nginx컨테이너에 접속이 되었고
/nginx3000 경로는 3000포트를 이용한 nginx 컨테이너로 정상적으로 접속하는 모습을 확인할 수 있다.