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 키 항목에 등록
이론적으로는 이 설정만으로
형태의 접속이 가능해야 합니다.
(지금까지 이렇게 잘 해왔었는데... 이번엔 안되더라구요..? 왜인지 이유는 찾지 못했음.)
실제로 겪었던 문제
하지만 제 경우에는,
- 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 내부에서 직접
으로 접속하여 프론트엔드가 정상적으로 뜨는지를 먼저 확인했습니다.
이 단계까지 완료되면,
- 서버 내부에서 서비스는 정상 기동
- 문제는 “외부에서 어떻게 접근할 것인가”로 넘어가게 됩니다.
Nginx vs Load Balancer 고민
다음 단계에서 고민했던 선택지는 두 가지였습니다.
- VM 내부에 Nginx 리버스 프록시 구성
- 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) 를 사용했습니다.
도메인 설정 단계
- 가비아 DNS 설정 화면 접속
- A 레코드 추가
- 값: Load Balancer의 외부 IP
- TTL 기본값 유지
이후 GCP Load Balancer에서:
- Google Managed SSL 인증서 생성
- 해당 도메인을 인증서에 연결
SSL 인증서는 Load Balancer에서 종료되며,
VM 내부에서는 HTTPS 설정을 따로 하지 않았습니다.
선택) IP 제한을 걸고 싶다면?
만약 특정 IP만 접근 가능하도록 제한하고 싶다면,
방법은 두 가지입니다.
- 방화벽 규칙으로 Ingress 제한
- 특정 IP 대역만 허용
- 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 |