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

단계별 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 저장소에 올려야 하므로, 다음 절차를 거칩니다.
AWS CLI로 로그인 및 설정
ECR 저장소 생성
이미지를 태그하고 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