[GCP - global LB & compute Engine] GCP 서버 구성 기록 (default VPC + 전역 로드밸런서 기반)(Product : SpeakNote)

2026. 1. 28. 02:35·DevOps/GCP

Compute Engine 생성부터 전역 Load Balancer 연결까지

본 글은 SpeakNote 서비스를 GCP 환경에 배포하면서
Compute Engine 생성 → SSH 접속 → 서비스 실행 → Load Balancer 선택 및 설정 → 도메인 연결
까지의 과정을 순서대로 기록한 글입니다.

설계 배경보다는 실제로 어떤 설정을 했는지를 중심으로 정리합니다.

 

나중에 운영 서버는 AWS 에서 진행할 거지만,, (Upstage 와 제휴업체인걸로 알고있어서!)

AWS 는 현재 start up 신청 대기 중이기 때문에, 개발 단계는 GCP 로 진행을 하려 합니다. 

 

GCP 계정 설정

처음 가입하면 , First Project 라고 뜨는걸로 알고있는데, 우선 저는 프로젝트별 관리를 편안히 하기 위해 새프로젝트를 만들었습니다.

Compute Engine 인스턴스 생성

먼저 GCP 콘솔에서 Compute Engine 인스턴스(VM) 를 생성했습니다.

기본 설정

  • 리전: asia-northeast3 (서울)
  • 머신 유형: e2 계열 (CPU/메모리는 서비스 규모에 맞게 선택)
  • 부팅 디스크
    • OS: Ubuntu 22.04 LTS
    • 디스크 유형: 표준 영구 디스크
  • 외부 IP: 고정 IP 할당

SpeakNote는 실시간 처리 요소(WebSocket, AI API 호출 등)가 포함되어 있어
프리티어보다는 안정적인 리소스 확보를 우선했습니다.

 

 

더보기

여기서 주의할점은

 

1. 네트워크 설정

만약에 네트워크를 처음부터 본인이 만들거라면,, default 가 아니라,

vpc 네트워크에서 한개 만들어준다음 설정하세요. (나중에 가서 수정 안됨.)

 

2. 부팅 디스크 설정 

 

만약에 Spring 서버를 돌려야 돼서 , java 실행 명령어가 필요하면 Ubuntu 로 하시는게 좋습니다.

 

3. 외부 IP 고정 할당 

 

Lb 를 다실거면, 굳이 할 필요는 없습니다! (나중에 lb 설정 시 고정 ip 설정하는게 있음.) 하지만 , VM 자체에 접속해서 테스트를 자주해야된다! 하시면 설정하시는게 좋습니다.

(저는 개발용이라 설정해놨습니다. 왜냐면 mysql , redis를 제 로컬에서 확인하기 좀더 수월히 하기 위해서, 그리고  홉스카치를 통해 직접 요청해보려고요..)

 

4. 머신 유형 설정 

 

머신 유형은 단순히 “CPU/메모리”만 보지 말고,

  • 서버에 설치할 구성 요소
  • Docker 컨테이너 개수
  • 로그, 캐시, 이미지 용량

까지 전체 리소스 사용량을 고려해서 선택하시는 것이 좋습니다.

특히

  • Spring + AI 서버 + 프론트엔드를 한 VM에서 돌릴 경우

메모리는 생각보다 빨리 부족해질 수 있습니다

 

Compute Engine 접속을 위한 SSH 키 설정

VM 생성 시 기본 설정 화면에서 SSH 공개키를 등록했습니다.

  • 로컬에서 SSH 키 생성
  • 생성한 공개키를 VM 생성 화면의 SSH 키 항목에 등록

이론적으로는 이 설정만으로

 
ssh user@<외부 IP>

형태의 접속이 가능해야 합니다.

(지금까지 이렇게 잘 해왔었는데... 이번엔 안되더라구요..? 왜인지 이유는 찾지 못했음.)

 

실제로 겪었던 문제

하지만 제 경우에는,

  • VM 생성 시 SSH 키를 분명히 등록했음에도
  • 로컬 터미널에서 SSH 접속이 정상적으로 되지 않는 문제가 발생했습니다.

그래서 이 단계에서는

  • GCP 콘솔의 “인스턴스 수정 → SSH 키 직접 수정” 방식으로 우회해서 해결했습니다.

이 SSH 이슈와 해결 과정은 별도의 게시물로 정리할 예정이라,
본 글에서는 “이런 이슈가 있었고, 콘솔에서 SSH 키를 수정하는 방식으로 해결했다”는 기록만 남깁니다.

 

 

무사히 접속 성공...!!! VS 에 설정하는 방법도 다른 게시물에서 다루겠습니다.

 

 

 

SSH 접속이 가능해진 이후에는, VM 내부에서 각 서비스들을 포트별로 실행했습니다.

  • 프론트엔드 (Next.js): 3000
  • 백엔드 (Spring Boot): 8080
  • AI 서버 (FastAPI): 8000
더보기

여기서 주의할 점! 

1. Docker 올리기 전

 

도커 파일에 꼭꼭,, 캐시 활성화를 해두세요!!!(안그럼 요금 폭탄 맞음. 배포 할 때 마다)

 

2. health api 세개를 각 서버별 만들어두세요 (next -> /health , fast-> /fastapi/health , spring -> /api/heath 로 해둠)

 

3. cors 설정은 미리 바꿔놓던 .env 로 빼두세요.. 안그럼 다시 re build 해야 합니다.

이 단계에서는 서비스 실행 자체보다는,

  • 각 포트에서 정상적으로 LISTEN 상태인지
  • 컨테이너/프로세스가 정상 기동되었는지

를 확인하는 것이 목적이었습니다. (나중에 health check를 LB에서 진행을 하기 때문에 미리미리 올려놨습니다! )

 

localhost:3000 접속 확인

서비스 실행 후, SSH 터널링 또는 VM 내부에서 직접

 
http://localhost:3000

으로 접속하여 프론트엔드가 정상적으로 뜨는지를 먼저 확인했습니다.

이 단계까지 완료되면,

  • 서버 내부에서 서비스는 정상 기동
  • 문제는 “외부에서 어떻게 접근할 것인가”로 넘어가게 됩니다.

 

Nginx vs Load Balancer 고민

다음 단계에서 고민했던 선택지는 두 가지였습니다.

  1. VM 내부에 Nginx 리버스 프록시 구성
  2. GCP 전역(External) HTTP(S) Load Balancer 사용

당시 상황 정리

  • WebSocket 기능은 아직 고도화 단계
  • 현재는
    • 파일 업로드
    • 문서 임베딩 처리
    • Google 로그인 연동
      까지 확인 중인 상태

그럼에도 불구하고 Load Balancer를 선택한 이유

  • HTTPS / SSL 인증서 관리 부담 감소
  • 단일 도메인에서 경로 기반 분기 필요
  • 추후 WebSocket 확장 고려
  • GCP에서 제공하는 관리형 인프라 활용

결과적으로 Nginx는 사용하지 않고, 전역 HTTP(S) Load Balancer를 사용하는 방향으로 결정했습니다.

 

전역 HTTP(S) Load Balancer 설정

Load Balancer는 External HTTP(S) Load Balancer (전역) 로 생성했습니다.

주요 설정

프론트엔드 설정 시에는 고정 ip 만들기 하시면 됩니다! (해당 lb IP 를 가지고 이제 도메인 구매한 곳에 가서 설정하면 됨.)

  • Backend: Compute Engine VM
  • Backend Service
    • 포트별 서비스 연결
      • 3000 (Frontend)
      • 8080 (Backend)
      • 8000 (AI)

 

  • URL Map
    • / → Frontend
    • /api/* → Backend
    • /fastapi/* → AI 서버

 

헬스 체크 설정

각 서비스별로 헬스 체크 엔드포인트를 지정했습니다.

  • /health 또는 /api/health
  • 해당 포트로 접근 가능해야 함

헬스 체크 설정 후에는 반드시 방화벽에서 헬스 체크 트래픽을 허용해야 합니다. 안그럼 아예 안됩니다.

 

Load Balancer 사용 시 추가한 방화벽 설정

Load Balancer를 사용하는 순간,
“VM이 살아있다”와 “LB가 접근 가능하다”는 완전히 다른 문제가 됩니다.

그래서 default VPC에 다음 규칙들을 추가했습니다.

  • 헬스 체크용 Ingress 허용
    • Load Balancer 헬스 체크 소스 대역 허용
    • 포트: 3000 / 8080 / 8000
  • LB → VM 내부 전달 트래픽 허용
    • 내부 IP 대역 허용
    • 이 설정이 없으면 connection timeout 문제가 발생할 수 있습니다.

이 단계에서 방화벽 설정이 누락되면,

  • Backend가 Unhealthy로 표시되거나
  • upstream connect error가 발생합니다.

 

가비아 도메인 연결 및 SSL 인증서 설정

도메인은 가비아(Gabia) 를 사용했습니다.

도메인 설정 단계

  1. 가비아 DNS 설정 화면 접속
  2. A 레코드 추가
    • 값: Load Balancer의 외부 IP
  3. TTL 기본값 유지

이후 GCP Load Balancer에서:

  • Google Managed SSL 인증서 생성
  • 해당 도메인을 인증서에 연결

SSL 인증서는 Load Balancer에서 종료되며,
VM 내부에서는 HTTPS 설정을 따로 하지 않았습니다.

 

선택) IP 제한을 걸고 싶다면?

만약 특정 IP만 접근 가능하도록 제한하고 싶다면,
방법은 두 가지입니다.

  1. 방화벽 규칙으로 Ingress 제한
    • 특정 IP 대역만 허용
  2. Cloud Armor 사용
    • IP 기반 접근 제어
    • 추후 WAF 확장 가능

현재 단계에서는 개발/검증 목적이므로 IP 제한은 최소한으로만 적용했고, 운영 단계에서 추가 적용을 고려하고 있습니다.

 

이 글에서는 SpeakNote의 GCP 서버 환경을
아주 처음 단계부터 Load Balancer 연결까지 순서대로 정리했습니다.

다음 글에서는:

  • SSH 키 접속 문제 상세 분석 https://ye-seul0-0.tistory.com/192
 

[GCP - ssh] Compute Engine SSH 접속 실패 원인과 해결 – 콘솔 SSH로 직접 고친 방법 (Product : SpeakNote)

SSH 키 등록했는데 로컬에서 접속이 안 됐던 문제 (해결까지 한 번에 정리)Compute Engine 인스턴스를 생성하면서초기 설정 화면에서 SSH 공개키를 분명히 등록했습니다.하지만 인스턴스 생성 이후,

ye-seul0-0.tistory.com

 

  • Load Balancer + 방화벽 트러블슈팅

 

를 다뤄보겠습니당.

'DevOps > GCP' 카테고리의 다른 글

[GCP] egress 비용 폭증 원인 분석 -> 아키텍처 재설계 (Product : SpeakNote)  (0) 2026.01.31
[GCP - ssh] Compute Engine SSH 접속 실패 원인과 해결 – 콘솔 SSH로 직접 고친 방법 (Product : SpeakNote)  (0) 2026.01.28
'DevOps/GCP' 카테고리의 다른 글
  • [GCP] egress 비용 폭증 원인 분석 -> 아키텍처 재설계 (Product : SpeakNote)
  • [GCP - ssh] Compute Engine SSH 접속 실패 원인과 해결 – 콘솔 SSH로 직접 고친 방법 (Product : SpeakNote)
yeseul-kim01
yeseul-kim01
  • yeseul-kim01
    슬 개발일지
    yeseul-kim01
  • 전체
    오늘
    어제
    • 분류 전체보기 (79)
      • 자격증 (1)
        • 정보보안기사 (0)
      • DevOps (17)
        • Docker (6)
        • Kubernetes (1)
        • GitHub Actions (0)
        • AWS (4)
        • Monitoring (1)
        • Nginx (1)
        • GCP (3)
      • ServerDev (34)
        • SpringBoot (13)
        • DJango (5)
        • FastAPI (14)
        • Next (0)
        • Flask (0)
        • Database (2)
      • Algorithm (2)
        • BFS (0)
        • DFS (1)
        • 다익스트라 (0)
      • CS (8)
      • Data Engineering (1)
      • AI&MLOps (2)
      • Architecture (6)
      • Software Engineering (0)
        • Library Packaging (0)
      • Project (5)
        • docx-generator (0)
        • speak-note (2)
        • ms-serving (1)
        • keyshield (2)
      • ProgrammingLanguages (3)
        • Python (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Kubernetes
    백엔드
    rag
    실무일기-인프라편
    FastAPI - CORS 마스터
    MLops
    아키텍처
    실시간시스템
    KServe
    grpc
    Django
    멀티모듈
    multipartfile
    트러블슈팅
    depends
    di
    NLP부트캠프
    STT
    프로젝트기록-speaknote
    SpeakNote
    하이브리드아키텍처
    동시성제어
    비동기처리
    아키텍처설계
    FastAPI
    실무일기-백엔드편
    KeyShield
    docker
    프로젝트기록-KeyShield
    SpringBoot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
yeseul-kim01
[GCP - global LB & compute Engine] GCP 서버 구성 기록 (default VPC + 전역 로드밸런서 기반)(Product : SpeakNote)
상단으로

티스토리툴바