[GCP] Google Cloud(GCP) 3 tier 아키텍쳐 구축하기 (1)

vinca·2025년 2월 6일

Introduction

모든 서비스의 기본이 된다고 해도 과언이 아닌, 3 tier 아키텍쳐를 GCP 환경에서 구축해 보도록 합시다.

구조

전체적인 구조는 아래와 같습니다.

HTTP 7계층 외부 LB - Web Server (Apache HTTP) - TCP 4계층 내부 LB - WAS (Flask) - DB(MySQL)

이를 그림으로 본다면 아래와 같습니다.

최종 목적은 로드밸런서로 접속한 웹 서버 화면에서 버튼을 눌렀을 때, NLB → WAS → DB를 통해 DB에 있는 정보를 조회해 오는 것입니다.

☝️ Notice

  1. 테스트 시의 편의를 위해 각 인스턴스에는 임시 외부IP를 할당하여 사용합니다. 만약 이를 추후 production 환경에 적용시킨다면 모든 WEB, WAS 서버의 외부 IP를 제거한 뒤, NAT 게이트웨이(Cloud NAT)를 VCP에 달아주면 됩니다.
  2. 편의를 위해 us-central1-c 지역만을 사용합니다.
    이 또한 고가용성을 생각한다면 각 WEB, WAS 서버의 위치를 여러 서브넷에 분배하여 배치하면 됩니다.

시작

💡 구조상 앞단인 외부로드 밸런서와 WEB 서버부터 진행해보도록 합시다.

HTTP 7계층 외부 LB와 Web Server 연결하기

HTTP 7계층 외부 LB - Web Server (Apache HTTP)

LB를 생성하기 위해서는 먼저 Web Server 즉, 웹 서버가 될 인스턴스가 있어야 합니다.
LB는 인스턴스의 트래픽을 부하 분산해주는 장치이기 때문이죠.

따라서 웹 서버가 되는 인스턴스 2개를 생성해주도록 합니다.

1. 웹 서버 생성

1.1 웹 서버 VM 생성

테스트 용도의 구축이므로 비싼 인스턴스를 사용할 필요가 없습니다.
아래와 같이 VM 인스턴스를 생성해주도록 합니다.

리전 : us-central1 (아이오와)
머신 유형 : e2-micro
OS 및 스토리지 : ubuntu 20.04 LTS
네트워킹 : default 네트워크, 방화벽 규칙 1개 (HTTS 트래픽 허용)

  • 머신 구성

  • OS 및 스토리지

  • 네트워킹

별다른 설정은 없습니다. 다른 부분은 변경할 필요없이
그림과 같이 설정한 뒤, 인스턴스 생성 버튼을 눌러 인스턴스를 생성해주면 됩니다.

1.3 VM에 웹 서버 설치

이제 띄워진 VM에 Apache-HTTP 웹 서버를 설치해주도록 합시다.
VM 옆의 SSH 버튼을 눌러 VM에 접속해주도록 합니다.

SSH로 VM 인스턴스 내부에 접속했다면 검은색 CLI 화면을 볼 수 있습니다.

이제 아래의 명령어를 통해서 아파치 웹 서버를 설치해줍니다.

1.4 Apache 웹 서버 설치

아파치 웹 서버를 설치해줍니다.

sudo apt update
sudo apt install apache2 -y

1.5 mod_proxy 모듈 활성화

웹에서 받은 요청을 WAS(Flask)서버로 보내기 위해 모듈을 활성화 해줍니다.

sudo a2enmod proxy proxy_http
sudo systemctl restart apache2

1.6 Apache 설정 파일 수정

웹서버에서 보내는 요청을 내부 LB로 프록시하기 위한 코드입니다.
이렇게 하면 /api/users 경로로 들어오는 요청을 내부 프록시 LB로 전송하게 됩니다.
아직 내부 LB를 생성하기 전이지만, 미리 틀을 만들어 놓는 작업입니다. (이후 수정)

sudo nano /etc/apache2/sites-available/000-default.conf

위 명령어로 파일을 연 뒤, 아래와 같이 작성합니다.

<VirtualHost *:80>
    ServerName your-domain.com
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    # /api/users 요청을 4계층 LB로 전달
    ProxyPass "/api/users" "http://localhost:25/api/users"
    ProxyPassReverse "/api/users" "http://localhost:25/api/users"


    # 로그 설정
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

이후 이 localhost:25 부분은 내부 TCP LB의 아이피로 수정하게 되며, 미리 틀을 만들어 놓는 작업입니다.

아래 그림과 같이 최종 결과가 나타나며 기타 주석들은 지워도 상관없습니다.

Ctrl + X를 눌러 나가며, 저장할지 묻는 질문에 Y를 눌러줍니다.

1.7 웹 프론트 화면 생성

우리가 보게되는 웹 프론트 화면을 생성해주도록 합니다.
사용자가 접속했을 때 보게 되는 버튼이 있는 바로 그 웹 화면입니다.

sudo nano /var/www/html/index.html

기존 내용을 지우고, 아래 내용으로 전부 교체해주도록 합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>DB 조회 버튼</title>
    <script>
        function fetchData() {
            fetch('/api/users')
            .then(response => response.json())
            .then(data => {
                document.getElementById("result").innerText = JSON.stringify(data, null, 2);
            })
            .catch(error => console.error("Error:", error));
        }
    </script>
</head>
<body>
    <h1>데이터 요청</h1>
    <button onclick="fetchData()">DB 조회</button>
    <pre id="result"></pre>
</body>
</html>

Ctrl + X를 눌러 나가며, 저장할지 묻는 질문에 Y를 눌러줍니다.

1.8 설정 적용 및 재시작

이제 웹 서버의 설정을 적용하고, 재시작 해줍니다.

sudo systemctl restart apache2

1.9 방화벽 규칙 생성

웹 서버의 접속을 위해서 VPC 네트워크 > 방화벽 > 방화벽 규칙 추가에 들어가 0.0.0.0/0의 접속 범위에서 tcp 80, 8080 포트로의 접근을 허용하는 규칙을 만들어 주도록 합니다.

1.10 웹 서버 접속

이제 웹 서버 인스턴스의 외부 IP를 통해서 http://<외부 IP> 접속해보면 위와 같은 화면을 볼 수 있습니다.
버튼은 눌러봐도 아직 내부 LB 및 WAS, DB 그 무엇도 없으므로 아무런 동작도 하지않습니다.

2. 생성한 웹 서버를 인스턴스 그룹으로 만들기

생성한 웹 서버 VM이 LB에 연결되기 위해서는 단일 VM이 아닌 "그룹"단위가 되어야합니다.

생성된 웹 서버를 기반으로 그룹 만들기를 눌러줍니다.

이제 아래 그림과 같이 인스턴스 그룹을 구성해줍니다.(인스턴스 개수 2)
여기서 중요한 점은 "인스턴스 그룹 구성" 메뉴를 눌러 포트 매핑에 현재 VM 인스턴스(웹서버)가 돌아가는 80번 포트의 이름을 지어줘야 합니다.

(포트 이름은 자유롭게 지으셔도 됩니다. 하지만 http 포트이므로 http로 지어주는게 일반적입니다.)

📍 이처럼 이름을 지어주는 이유는 바로 뒤에 나올 LB와 연결할 때 포트 숫자가 아닌 "이름"이 있어야만 LB와 인스턴스 그룹을 연결할 수 있기 때문입니다.

생성된 인스턴스 그룹은 아래와 같으며, http://<외부 IP> 어디로 접속하든 동일한 웹 페이지가 나오는 것을 확인할 수 있습니다.

저는 여기서 두 인스턴스의 차이를 구별하기 위해서 각 VM에 접속하여 1.7 웹 프론트 화면 생성 부분의 코드를 수정하여 1, 2번 VM 각각 이름을 써줬습니다. (굳이 안 해주셔도 됩니다)

3. ALB 생성

이제 만들어진 두 WEB 인스턴스(인스턴스 그룹으로 묶임)를 ALB를 생성하고 이에 연결해 주도록 합시다.

네트워크 서비스 > 부하 분산 > 부하 분산기 만들기를 통해서 아래 그림과 같이 부하 분산기를 선택해 줍니다.

☘️ Tip!
사실 이 실습 자체에서는 (1)HTTPS를 통해서 도메인을 연결하고, 인증서를 붙일 것도 아니고 (2)URL 기반 라우팅 또한 수행하지 않을 것이기에, 굳이 여기서 HTTP LB (ALB)를 쓸 필요는 없다.
하지만, 프로덕션 환경에서는 99.9% WEB의 앞단에 HTTPS를 넣으므로 ALB가 사용되므로 해당 실습에서도 ALB를 사용하도록 한다.

3.1 프런트엔드 구성

프런트엔드란 GCP LB에서 LB의 IP, 포트를 의미합니다.
거창하게 프런트엔드라고 하니까, 웬지 웹 서버 같기도하고, React, Vue.js 같은 게 생각나는데 헷갈리지 않도록 주의.

☝️ 그냥 LB의 IP, LB로 접속하는 포트입니다.

3.2 백엔드 구성

백엔드란 LB를 통해서 들어오게 되는 트래픽의 목적지. 즉, 로드밸런싱 될 대상 서버입니다.

이전 만들어 두었던 웹 서버 2개 (VM 인스턴스 그룹)이 그 대상이 됩니다.

상태 확인(헬스 체크)은 해당 인스턴스가 정상적으로 동작하는지 확인하는 시스템입니다.

인스턴스가 정상적으로 동작해야만 LB가 해당 인스턴스로 트래픽을 보내주기 위해 필요한 시스템이죠.

요청 경로에는 루트 경로 / 를 써주면 되는데, 실제로 저희가 만들었던 아파치 웹 서버를 생각하면 / 경로를 제외하고는 현재까지 다른 웹 페이지를 만든적이 없습니다.
따라서 해당 경로를 헬스 체크 경로로 사용하도록 합니다.

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글