FastAPI 서버개발, 컨테이너 이미지 업로드 GCR 이용하기

FastAPI는 현대적인 웹 API를 개발하는 데 매우 유용한 프레임워크입니다. Python의 타입 힌트를 활용하여 빠르고 효율적으로 RESTful API를 구축할 수 있습니다. 이번 포스트에서는 FastAPI를 사용하여 컨테이너 이미지를 Google Cloud Registry(GCR)에 업로드하는 방법에 대해 자세히 설명하겠습니다.

1. FastAPI란?

FastAPI는 Python으로 작성된 웹 프레임워크로, 비동기 요청을 지원하며, 높은 성능과 직관적인 API를 제공합니다. 다음은 FastAPI의 주요 특징입니다:

  • 빠른 성능: Starlette와 Pydantic을 기반으로 하여 높은 성능을 보장합니다.
  • 타입 힌트 지원: Python의 타입 힌트를 활용하여 자동으로 API 문서를 생성할 수 있습니다.
  • 비동기 지원: 비동기 처리를 통해 성능을 극대화할 수 있습니다.

2. GCR(Google Container Registry)란?

GCR은 Google Cloud Platform(GCP)의 컨테이너 레지스트리로, Docker 컨테이너 이미지를 저장하고 관리하는 데 사용됩니다. GCR을 사용하면 Kubernetes 클러스터에서 쉽게 이미지를 배포할 수 있습니다. GCP의 여러 리소스와 통합되어 있어 효율적입니다.

3. FastAPI 프로젝트 설정

FastAPI 프로젝트를 설정하기 위해 다음과 같은 단계를 따릅니다:

3.1. 환경 세팅

bash
mkdir fastapi-gcr
cd fastapi-gcr
python3 -m venv venv
source venv/bin/activate
pip install fastapi uvicorn google-cloud-storage

여기서는 가상 환경을 만들고 FastAPI 및 관련 라이브러리를 설치합니다.

3.2. FastAPI 애플리케이션 구현

다음으로 FastAPI 애플리케이션을 구현합니다. 간단한 이미지 업로드 API를 생성할 것입니다.

python
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from google.cloud import storage
import os

app = FastAPI()

# GCS 클라이언트 초기화
storage_client = storage.Client()
bucket_name = 'YOUR_BUCKET_NAME'
bucket = storage_client.bucket(bucket_name)

@app.post("/upload/")
async def upload_image(file: UploadFile = File(...)):
    # 파일을 Google Cloud Storage에 업로드
    blob = bucket.blob(file.filename)
    blob.upload_from_file(file.file, content_type=file.content_type)
    
    return JSONResponse(content={"message": "File uploaded successfully!", "filename": file.filename})

위의 코드는 FastAPI의 이미지 업로드 API를 생성합니다. 파일을 GCS에 업로드하기 위해 google-cloud-storage 라이브러리를 사용합니다.

4. Google Cloud Storage 인증

GCP에 접근하기 위해서는 인증이 필요합니다. 서비스 계정 키 파일을 생성하고, 환경 변수를 설정합니다.

4.1. 서비스 계정 생성

1. GCP 콘솔에 로그인합니다.

2. IAM 및 관리 > 서비스 계정으로 이동합니다.

3. 새 서비스 계정을 만듭니다. 역할에 Storage Admin을 선택합니다.

4. JSON 키 파일을 생성하고, 이를 프로젝트 루트에 저장합니다.

4.2. 환경 변수 설정

bash
export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/service-account-file.json"

5. FastAPI 애플리케이션 실행

FastAPI 웹 서버를 실행하려면 다음 명령어를 사용합니다:

bash
uvicorn main:app --host 0.0.0.0 --port 8000 --reload

6. GCR에 Docker 이미지 배포하기

Docker 이미지를 GCR에 배포하기 위한 설정을 진행합니다.

6.1. Dockerfile 생성

애플리케이션을 도커 이미지로 패키징하기 위해 Dockerfile을 만듭니다.

Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8

COPY ./app /app
WORKDIR /app
RUN pip install google-cloud-storage

EXPOSE 80
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

6.2. Docker 이미지 빌드

bash
docker build -t gcr.io/YOUR_PROJECT_ID/fastapi-gcr .

6.3. GCR에 로그인

bash
gcloud auth configure-docker

6.4. Docker 이미지 푸시

bash
docker push gcr.io/YOUR_PROJECT_ID/fastapi-gcr

7. 결론

이번 포스트에서는 FastAPI를 사용하여 GCR에 이미지를 업로드하는 간단한 API를 구현하는 과정을 살펴보았습니다. FastAPI는 쉽고 직관적인 API 개발을 지원하며, GCR은 Docker 이미지를 효율적으로 관리할 수 있게 해줍니다.

FastAPI와 GCR을 활용한 웹 서비스 구축은 클라우드 환경에서의 유연한 확장이 가능하게 하여, 실제 서비스에서 큰 장점을 제공합니다. 다양한 기능과 성능을 바랑하는 FastAPI를 통해 여러분의 웹 애플리케이션을 더욱 발전시키길 바랍니다.