Cloud

Google Cloud 서버 구축 (Compute Engine, Cloud Run 등)

aiagentx 2025. 5. 29. 09:47
728x90
SMALL

애플리케이션을 직접 실행할 서버 환경을 구축하는 방법으로 GCP에서는 가상 머신부터 컨테이너 기반 무서버 서비스까지 다양한 옵션을 제공합니다. 초보자가 Python 기반 서비스를 운영할 때 많이 사용하는 Compute Engine VMCloud Run을 중심으로 설명합니다.

Compute Engine: 가상 머신(VM) 인스턴스 설정

필요한 서비스: Compute Engine (컴퓨트 엔진).
개념: Compute Engine은 GCP에서 제공하는 **IaaS(Infrastructure as a Service)**로, 원하는 사양의 **가상 머신 인스턴스(VM)**를 생성하여 사용할 수 있습니다. 즉, 물리적인 서버를 임대하는 것과 비슷하게, 사용자가 VM의 운영체제, 소프트웨어 스택, 런타임 등을 자유롭게 관리할 수 있습니다. Windows 및 Linux 이미지를 선택해 생성할 수 있으며, VM에 접속(SSH 등)하여 Python 환경을 설정하고 애플리케이션을 구동할 수 있습니다. 완전한 OS 접근이 가능하므로 가장 유연하지만, 사용자가 시스템 업데이트, 보안, 확장 등을 직접 관리해야 합니다.

Python과의 연동: Compute Engine VM은 일반 서버와 같기 때문에, 특별한 GCP 전용 연동 코드가 필요하지는 않습니다. 대신 gcloud CLI나 GCP 콘솔로 VM 인스턴스를 생성/제어하고, 그 내부에서 Python 애플리케이션을 실행하면 됩니다. 예를 들어 Ubuntu 리눅스 VM을 하나 생성하고 그 안에 Python Flask 앱을 설치하여 운영할 수 있습니다. VM 생성은 콘솔 UI로 가능하지만, gcloud 명령으로 할 수도 있습니다. 아래는 Debian 리눅스 기반의 e2-micro VM을 생성하는 gcloud 명령 예시입니다reddit.com:

bash
CopyEdit
gcloud compute instances create my-vm \ --zone=us-east1-b \ --machine-type=e2-micro \ --image-family=debian-11 \ --image-project=debian-cloud \ --no-address

위 명령은 미국 동부 us-east1-b 존(zone)에 e2-micro (초소형, 월 ~720시간 무료) VM을 생성합니다. --image-family와 --image-project는 Debian 11 운영체제 이미지를 선택하는 옵션이고, --no-address는 외부 IP를 할당하지 않도록 한 것입니다reddit.com. (외부 IP가 없으면 인터넷에서 직접 접속이 불가하지만 보안에는 유리합니다. 웹서버를 운영하려면 --no-address 옵션을 빼고 외부 IP를 받아야 합니다.)

VM이 생성되면 GCP 콘솔 또는 gcloud compute ssh my-vm --zone us-east1-b 명령으로 SSH 접속하여 서버 설정을 시작할 수 있습니다. 일반 리눅스 서버와 동일하게 패키지 설치, Python 가상환경 구성 등을 하면 됩니다. 예를 들어:

  1. SSH 접속 후 sudo apt update && sudo apt install python3-pip -y 등을 실행하여 Python과 pip를 설치합니다.
  2. 웹 애플리케이션의 코드를 배포하고, 필요한 패키지를 pip install로 설치합니다.
  3. Flask 앱을 실행하거나, 시스템 서비스로 등록하거나, 필요하다면 Gunicorn + NGINX 등의 구성을 해서 웹 트래픽을 처리합니다.
  4. 방화벽 설정: GCP VM 인스턴스는 기본적으로 SSH(22) 이외 포트가 차단되어 있습니다. 웹 서버(예: 포트 80, 443)를 열어주려면 해당 VM의 VPC 방화벽 규칙에 HTTP/HTTPS 트래픽을 허용해야 합니다. 콘솔에서 VM 세부정보의 “네트워크” 설정에서 간단히 HTTP/HTTPS 트래픽 허용 체크박스로 설정할 수 있습니다.

확장 및 관리: Compute Engine VM은 수동 확장이 기본입니다. 트래픽이 증가하면 스스로 새로운 VM을 띄우지 않으므로, 필요 시 자동 확장(managed instance groups) 설정을 추가로 해야 합니다. 또한 다수의 VM을 분산 처리하려면 부하 분산기(load balancer)도 설정 가능하지만, 이는 고급 주제입니다. 초보 단계에서는 단일 VM에서 애플리케이션을 구동하고 모니터링하면서 익숙해지는 것이 좋습니다.

주의사항: VM을 사용하면 유연성이 높지만 관리 부담도 따릅니다. OS 보안패치, 소프트웨어 업데이트, 장애 대응 등을 사용자가 직접 해야 합니다. 또한 VM은 켜진 동안에는 계속 과금되므로, 사용이 끝나면 중지(stop)하거나 삭제해야 비용이 들지 않습니다. (중지 시에는 디스크 비용만 남고, 삭제하면 모든 비용 중지) 특히 무료로 제공되는 e2-micro 인스턴스도 1개월 내내 1대만 무료이므로, 여러 대를 띄우면 추가 비용이 발생합니다. 그리고 외부 IP를 가진 VM은 인터넷에 노출되므로, SSH 포트 보안이나 UFW 같은 방화벽 설정, Fail2Ban 설치 등 보안 조치를 해두는 것을 권장합니다.
만약 이러한 서버 관리가 부담스럽다면, 다음에 설명할 Cloud Run이나 App Engine, Cloud Functions 같은 관리형 서비스를 고려해볼 수 있습니다.

Cloud Run: 서버리스(Serverless) 컨테이너 실행

필요한 서비스: Cloud Run.
개념: Cloud Run은 Docker 등 컨테이너 이미지로 패키징된 애플리케이션을 서버리스 방식으로 실행해주는 서비스입니다. 서버리스란 사용자가 인스턴스(VM)을 직접 관리하지 않아도 코드 실행을 서비스 형태로 이용할 수 있는 것을 의미합니다. Cloud Run에 애플리케이션을 배포하면, 필요한 시점에 Google이 컨테이너를 실행하여 요청을 처리하고, 사용되지 않을 때는 자동으로 리소스를 해제합니다. 자동 확장도 내장되어 있어, 트래픽이 증가하면 새로운 컨테이너 인스턴스를 여러 개 띄워 병렬 처리하고(최대 1000개까지 자동 확장), 트래픽이 감소하면 인스턴스를 줄입니다. 이러한 특징 때문에, 초보자도 컨테이너만 준비하면 복잡한 인프라 설정 없이 쉽게 서비스를 배포할 수 있습니다cloud.google.com.

Python과의 연동: Cloud Run에 배포할 애플리케이션은 HTTP 요청을 처리하는 서버여야 합니다. Python으로는 Flask, FastAPI, Django 등의 프레임워크를 컨테이너에 넣어 배포할 수 있습니다. 기본 흐름은:

  1. 애플리케이션 코드 작성 (예: Flask로 “Hello World” 반환하는 코드).
  2. 컨테이너 이미지로 빌드 (Dockerfile 작성 또는 Cloud Build 사용).
  3. Cloud Run에 이미지 배포.

예를 들어, Flask를 사용한 간단한 웹 서비스를 Cloud Run에 배포하는 과정을 요약하면:

  • main.py: Flask 앱을 생성하고 루트 경로에 대한 응답을 정의.
  • requirements.txt: 필요한 Python 패키지 (Flask 등) 명시.
  • Dockerfile: 애플리케이션을 컨테이너화하기 위한 규칙 작성. 예시:이 Dockerfile은 파이썬 슬림 이미지를 기반으로, 의존성 설치 후 main.py를 실행하는 컨테이너를 정의합니다. (Flask라면 gunicorn으로 실행하거나, Cloud Run은 포트 8080을 기본청취하므로 Flask 앱도 8080 포트를 사용해야 함)
  • Dockerfile
    CopyEdit
    FROM python:3.10-slim WORKDIR /app COPY requirements.txt ./ RUN pip install -r requirements.txt COPY . . ENV PORT=8080 CMD ["python", "main.py"]
  • 빌드 & 배포: Docker가 설치되어 있다면 로컬에서 이미지를 빌드하고 Artifact Registry에 push한 후 Cloud Run에 배포할 수 있고, gcloud CLI로 간편 배포도 가능합니다. GCP는 소스에서 바로 빌드/배포하는 기능을 제공하므로, 해당 디렉터리에서 아래 명령을 사용할 수 있습니다:이 한 줄로 현재 디렉토리 코드를 빌드하여 Cloud Run에 배포합니다cloud.google.comcloud.google.com. 배포 과정에서 Artifact Registry API 등을 활성화할지 물으면 "Y"로 승인하면 되고, 배포 후 서비스 URL이 출력됩니다cloud.google.com.
  • bash
    CopyEdit
    gcloud run deploy --source . --project=my-project-id --region=us-central1 --allow-unauthenticated

Cloud Run에 배포된 서비스는 요청이 올 때만 컨테이너가 자동 기동되므로, 유휴 시에는 비용이 거의 발생하지 않는 장점이 있습니다. (일정 기간 요청이 없으면 컨테이너를 완전히 0으로 스케일링하여 비용 0) 또한 Cloud Run은 컨테이너만 구동할 수 있으면 언어나 프레임워크 제한이 없으므로 Python 외 다른 언어 서비스도 동일 패턴으로 배포할 수 있습니다.

실제 예시: 만약 우리가 hello.py라는 Flask 웹앱을 작성했다면:

python
CopyEdit
# hello.py from flask import Flask, request app = Flask(__name__) @app.route("/") def hello(): name = request.args.get("name", "World") return f"Hello, {name}!" if __name__ == "__main__": app.run(host="0.0.0.0", port=8080)

이 코드를 컨테이너로 빌드하고 Cloud Run에 배포하면, Cloud Run이 부여한 URL (예: https://hello-abcdef-uc.a.run.app)에서 ?name=GCP 같은 쿼리로 서비스를 호출할 수 있습니다. Cloud Run은 HTTPS를 자동 지원하므로 별도 인증서 설정이 필요 없고, 도메인도 기본 제공됩니다 (원하는 도메인으로 맵핑도 가능).

주의사항: Cloud Run은 기본적으로 무상태(stateless) 컨테이너 실행을 가정합니다. 컨테이너의 로컬 디스크는 임시이며 요청 사이에 상태를 유지하지 않으므로, 상태 저장이 필요하면 Cloud Storage나 Firestore 같은 외부 저장소를 사용해야 합니다. 그리고 Cloud Run의 인스턴스는 동시에 여러 요청을 처리할 수도 있는데, 동시 요청 수(--max-instances와 동시성 파라미터) 설정을 조정해줘야 애플리케이션 특성에 맞는 성능을 낼 수 있습니다. 예를 들어 CPU 집약적인 작업이라면 동시성 1로 설정해 컨테이너 하나당 한 요청만 처리하게 할 수 있습니다.
또한 Cloud Run 서비스는 기본 모든 인터넷에 공개됩니다. --allow-unauthenticated 옵션을 주면 누구나 접근 가능하며, 이를 생략하면 IAM을 통해 인증된 사용자만 호출할 수 있습니다. 초보 단계에서는 공개로 두고 개발하지만, 나중에 API 서버 등을 만들 때는 이 옵션을 신중히 관리해야 합니다.
비용 측면에서 Cloud Run은 사용한 만큼만 과금되며, 월 200만 회 요청, 360,000 CPU초, 2GB 메모리초, 그리고 1GB 네트워크 아웃바운드가 무료 제공됩니다cloud.google.comcloud.google.com. 이 무료 할당이 꽤 넉넉해서, 개인 프로젝트나 소규모 서비스는 거의 무료로 운영 가능할 정도입니다reddit.com. 다만 초과 사용분은 과금되므로, 예상치 못한 대량 트래픽 발생시 비용 모니터링을 하는 것이 좋습니다. 필요하면 Cloud Run 동시 실행 인스턴스 수 상한을 걸어 폭주를 방지할 수 있습니다.

 

 😊 각 항목별로 GCP 서비스를 활용하는 방법과 Python 연동, 실습 예시, 그리고 주의사항을 살펴보았습니다. 요약하면:

  • GCP 설정: 계정/프로젝트 생성, 결제 및 API 설정, gcloud/Cloud Shell 활용법.
  • 웹사이트 호스팅: Cloud Storage로 정적 사이트 호스팅하거나, App Engine으로 Python 웹앱 쉽게 배포.
  • 데이터 저장: Cloud Storage로 파일 저장, Firestore로 NoSQL 데이터 관리 (필요 시 Cloud SQL 등도 고려).
  • 머신러닝: Vertex AI 플랫폼으로 모델 자동/커스텀 훈련 및 배포, 또는 사전 학습된 AI API 바로 활용.
  • 서버 구축: Compute Engine VM으로 직접 서버 운영하거나, Cloud Run으로 컨테이너 기반 서버리스 배포.

초보 단계에서는 관리형 서비스를 최대한 활용하여 시행착오를 줄이고, 점차 세부 설정이 필요한 Compute Engine 같은 것으로 넘어가보는 것을 권장합니다. GCP는 처음엔 용어도 많고 설정도 필요하지만, 차근차근 따라 하면 강력한 클라우드 인프라를 Python 코드 몇 줄 또는 클릭 몇 번으로 활용할 수 있게 될 것입니다. 공식 문서와 예제 코드cloud.google.comsupertype.ai를 자주 참고하시고, 작은 프로젝트부터 시도해보세요. Good luck with your GCP journey! 🚀

728x90