메인 콘텐츠로 건너뛰기

FastAPI와 Docker, AWS ECS로 머신러닝 모델 배포하기

설탕사과
설탕사과
조회수 19
요약

단계별 ML 모델 배포 여정

머신러닝 모델을 실제 서비스로 만들려면, 단순히 학습만으로 끝나지 않고 다양한 배포 과정을 거쳐야 합니다. 이 글에서는 scikit-learn으로 만든 모델을 FastAPI로 감싸고, Docker로 컨테이너화해 AWS ECS(Fargate)를 통해 클라우드에 올리는 일련의 과정을 소개합니다.

모델 학습 및 저장

먼저 머신러닝 모델을 훈련시킨 후 파일로 저장합니다. 여기서는 유명한 아이리스 데이터셋을 사용해 랜덤 포레스트 분류기를 만들었고, 결과를 iris_model.pkl로 저장했습니다.

# train_model.py
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import joblib
X, y = load_iris(return_X_y=True)
model = RandomForestClassifier()
model.fit(X, y)
joblib.dump(model, iris_model.pkl)

FastAPI로 모델을 API화

저장된 모델을 바로 사용할 수 있도록 FastAPI 웹 프레임워크로 REST API를 만듭니다. 사용자는 입력값(feature)을 JSON 형태로 POST해서 결과를 받을 수 있습니다.

# app/main.py
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
import numpy as np

app = FastAPI()
model = joblib.load(iris_model.pkl)

class IrisFeatures(BaseModel):
    features: list[float]

@app.post(/predict)
def predict(iris: IrisFeatures):
    X = np.array(iris.features).reshape(1, -1)
    prediction = model.predict(X)
    return {prediction: int(prediction[0])}

테스트와 필요한 패키지 준비

서비스에 필요한 파이썬 라이브러리는 requirements.txt에 모았습니다.

fastapi
uvicorn[standard]
scikit-learn
joblib
numpy

로컬에서 아래 명령어로 실행하며 올바로 동작하는지 점검합니다.

uvicorn app.main:app --host 0.0.0.0 --port 8000

Docker로 컨테이너화

코드를 Docker로 포장하면 어디서든 동일하게 실행할 수 있습니다. Dockerfile을 만들어 이미지를 생성하고, 로컬에서 실행하여 환경이 잘 갖춰졌는지 확인합니다.

# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000]

이미지 만들기:

docker build -t fastapi-iris-app .

실행해보기:

docker run -p 8000:8000 fastapi-iris-app

AWS ECR에 이미지 업로드

이제 AWS에서 서비스를 준비합니다. 도커 이미지를 AWS ECR 저장소에 올려야 하므로, 다음 절차를 거칩니다.

  1. AWS CLI로 로그인 및 설정

  2. ECR 저장소 생성

  3. 이미지를 태그하고 ECR에 푸시

aws configure
aws ecr create-repository --repository-name fastapi-iris

이미지 태그 지정 및 푸시:

docker tag fastapi-iris-app:latest <ECR URI>
docker push <ECR URI>

ECS Fargate로 서비스 배포

클라우드에서 도커 이미지를 실행하기 위해 ECS(Fargate) 클러스터와 서비스, 태스크 정의를 만듭니다.

  • ECS 클러스터 생성 (“네트워킹 only”)

  • 태스크 정의에서 이미지, 포트(8000), 네트워크 설정

  • 서비스 생성 후 태스크 수, 서브넷, 퍼블릭 IP 활성화

  • 완료 후 공개 IP 혹은 로드밸런서 주소 확인 가능

배포 완료 후 서비스 테스트

배포가 성공했다면, 클라우드상 API서버에 아래와 같이 테스트 요청을 보내 결과를 받습니다.

curl -X POST http://<배포된 서버 주소>:8000/predict 
-H Content-Type: application/json 
-d {features: [5.1, 3.5, 1.4, 0.2]}

성공하면 나만의 ML 서비스가 세상에 공개된 것입니다!

실전 배포의 의의

노트북 안에만 머무르던 모델을 실제 세계에 공개하는 것은 데이터 과학자의 진짜 성장입니다. 위 단계들을 통해 모델은 언제 어디서나 활용될 수 있는 서비스가 되었고, 여러분 역시 DevOps 및 백엔드 실무를 경험하게 됩니다. 앞으로 다양한 ML 모델도 쉽게 배포할 수 있게 됩니다!


출처 : Deploying an ML Model with FastAPI, Docker & AWS ECS | by Kevin Akbari | Aug, 2025 | Medium