Provisioning, fastapi

Jeonghak Cho·2025년 3월 1일

Provisioning

목록 보기
2/44

FASTAPI

개요

FastAPI는 Python 기반의 웹 프레임워크로, API 개발을 빠르고 효율적으로 할 수 있도록 설계되었다. 성능이 뛰어나고, 타입 힌트를 적극적으로 활용하여 코드의 안정성과 가독성을 높일 수 있다.

할일

rest api 프레임워크를 fastapi로 선택한 후 필요한 일을 정의한다. 여기서는 빠른 구축에 필요한 디버깅용 이미지 생성에 목적을 둔다. 보안, 성능을 위해 release 버전은 구제척으로 항목들이 조정되어야 한다. 예를 들어 user를 root에서 일반 사용자로 조정한다. 또한 상황에 따라 프레임워크 변경도 생각해 볼 수 있다. Spring Boot나 Poem Open API 서버 등 많은 선택지가 있다.

  • 가장 가벼운 이미지 형태로 python3 테스트 환경 구축
  • 필수 유틸리티 (curl, vi) 기본 설치
  • 네트워크 확인 도구 설치
  • 사용자를 root로 하여 작업 제약 제거
  • 참조 용 기본 REST API 소스 작성

절차

  • 파이썬 소스 (app.py) 작성
  • 이미지 내 파이썬 버전과 로컬 환경 파이썬 버전 맞추기
  • 로컬 환경 라이브러리 설치
  • main.py 로컬 테스트
  • 도커파일 생성
  • 도커 빌드
  • 도커 단위 테스트

진행

파이썬 소스 (main.py) 작성

작업 폴더를 하나 생성하고 이동한다. main.py 파일을 생성하고 가장 간단한 소스를 작성한다. main.py테스트를 컨테이너로 빌드하기 전에 로컬에서 테스트 가능하도록 구성한다. 여기서는 Ubuntu 기준으로 구성하였다.

mkdir backend
cd backend

vi main.py

main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def base():
    return {"message": "Hello, FastAPI!"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "query": q}

이미지 내 파이썬 버전과 로컬 환경 파이썬 버전 맞추기

사용할 이미지가 python:3.11-alpine 이므로 로컬 테스트 시 사용할 파이썬 버전을 맞추어 주어야 한다.

sudo apt update
sudo apt-get update
sudo apt install python3-pip

sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11
sudo apt install python3.11-dev python3.11-venv python3.11-distutils python3.11-gdbm python3.11-tk python3.11-lib2to3

vagrant@slave1:~/fastapi$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1
update-alternatives: using /usr/bin/python3.11 to provide /usr/bin/python (python) in auto mode

vagrant@slave1:~/fastapi$ python -V
Python 3.11.11

로컬 라이브러리 설치

  • requirements.txt 파일 생성
fastapi
uvicorn
  • 라이브러리 설치
vagrant@slave1:~/backend$ vi requirements.txt
vagrant@slave1:~/backend$ pip install -r requirements.txt

main.py 로컬 테스트

uvicorn은 관습이 main.py를 사용하니 조정해 준다.

python3 -m uvicorn main:app --reload &

vagrant@slave1:~/backend$ python3 -m uvicorn main:app --reload &
[1] 72908
vagrant@slave1:~/fastapi$ INFO:     Will watch for changes in these directories: ['/home/vagrant/backend']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [72908] using WatchFiles
INFO:     Started server process [72910]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

vagrant@slave1:~/backend$ curl localhost:8000
INFO:     127.0.0.1:47360 - "GET / HTTP/1.1" 200 OK
{"message":"Hello, FastAPI!"}

브라우저 접속 하여 swagger화면을 확인할 수 있다.

도커 파일 생성

Docerfile.backend-dev

FROM python:3.11-alpine
WORKDIR /app

USER root

RUN apk update && \
    apk add --no-cache curl vim bash

COPY ./requirements.txt /app

RUN pip install -r requirements.txt

COPY ./main.py /app

EXPOSE 5000

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

도커 이미지 빌드

sudo docker build . -t backend:0.1 -f Docerfile.backend-dev
vagrant@slave1:~/backend$ sudo docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
backend           0.1       14d9241593bd   23 hours ago     123MB

도커 이미지 테스트

vagrant@slave1:~/backend$ sudo docker run -p 5000:5000 backend:0.1
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)

vagrant@slave1:~/bff$ curl localhost:5000/
{"message":"Hello, FastAPI!"}

도커 이미지 저장소 푸시

dockerhub 나 pivate 도커 이미지 저장소로 이미지를 PUSH한다.

sudo docker tag backend:0.1 chojeonghak/backend:0.1
sudo docker push chojeonghak/backend:0.1

쿠버네티스 메니페스터 작성

backend.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  selector:
    matchLabels:
      app: backend
  replicas: 1
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: chojeonghak/backend:0.1
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: backend
  labels:
    app: backend

spec:
  ports:
  - port: 5000
    protocol: TCP
  selector:
    app: backend
  type: ClusterIP

쿠버네티스 배포

vagrant@slave1:~/backend$ vi backend.yml
vagrant@slave1:~/backend$ k apply -f backend.yml
deployment.apps/backend created
service/backend created

배포 확인

편의상 노드 포트가 사용하였다. 노드 아이피에 서비스 아이피 확인한 후 브라우저에서 swagger ui 확인이 가능하다.

vagrant@slave1:~/backend$ k get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          13d
backend       NodePort    10.105.125.216   <none>        5000:31217/TCP   5m7s

0개의 댓글