FastAPI 애플리케이션을 배포하는 방법은 무엇인가요?

How to Deploy an FastAPI Application_
How to Deploy an FastAPI Application_

호스팅 제공업체는 많지만, Python 호스팅을 지원하는 CGI(Common Gateway Interface) 또는 mod_wsgi 모듈을 제공하는 곳은 극소수에 불과합니다. 그러나 2023년 Stack Overflow 개발자 설문조사에 참여한 개발자 중에서는 애플리케이션 개발 및 배포를 위해 Docker를 사용한 컨테이너화가 선두를 차지했습니다.

FastAPI와 같은 프레임워크를 사용하여 개발한 Python 애플리케이션의 경우, 서비스형 컨테이너(CaaS) 를 통한 배포는 코드를 GitHub에 푸시하는 것만큼이나 간단합니다. 이 블로그에서는 FastAPI 애플리케이션을 도커라이즈하고 CaaS를 통해 배포하는 방법을 알아봅니다.

주요 내용

  • Docker와 FastAPI는 강력한 듀오로, 종속성이 포함된 간소화된 패키지 배포를 가능하게 해줍니다.
  • FastAPI는 비동기 작업, 데이터 유효성 검사 및 OpenAPI에서는 탁월하지만 커뮤니티 지원 및 호환성에서는 부족합니다.
  • Back4app은 FastAPI 배포를 간소화하고, 자동 업데이트를 위해 GitHub와 동기화하며, 클라우드 데이터베이스 설정을 제공합니다.

FastAPI란 무엇인가요?

FastAPI는 RESTful API를 개발하기 위한 경량 오픈소스 Python 웹 프레임워크입니다. 2018년에 출시된 이 프레임워크는 Pydantic 모델과 Starlette을 지원하여 Node.js 및 Golang과 동등한 수준의 성능을 제공합니다. 또한 이 프레임워크는 사용자 정의가 가능하여 코드베이스를 유연하게 설계할 수 있습니다.

Python 버전 3.6 이상에서 JSON 스키마 및 유형 힌트를 지원하는 Pydantic 모델을 통해 FastAPI는 데이터를 쉽게 구문 분석하고 런타임에 유효성을 검사할 수 있습니다.

Starlette 프레임워크는 비동기 서버 게이트웨이 인터페이스(ASGI)를 FastAPI에 도입하여 Python RESTful API에서 비동기 작업을 수행하고 Uvicorn ASGI 서버에서 코드를 실행할 수 있게 해줍니다.

Node.js의 Nodemon과 마찬가지로, Uvicorn 서버는 API 경로의 변경 사항을 수신하고 업데이트할 때마다 런타임을 다시 시작합니다.

2023년 Stack Overflow 개발자 설문조사에 참여한 개발자 중 7.42%만이 FastAPI를 사용한다고 답했지만, 이 글을 쓰는 현재 GitHub의 총 사용자 수는 203,000명입니다. 이 글을 쓰는 시점에 498명 이상의 기여자와 190개의 릴리스가 있는 FastAPI는 지속적인 업데이트와 패치를 받고 있습니다.

그러나 FastAPI를 Golang 및 Node.js와 동일한 성능 수준으로 만드는 것은 여전히개발자들 사이에서 논쟁의 여지가 있습니다.

다른 사람들은 동의하지만, 일부 사람들은 Python 웹 개발이 크게 개선되었지만, FastAPI는 여전히 두 가지의 성능과 비교할 수 없다고 주장합니다.

FastAPI의 장점

  • 비동기 연산 지원: Python의 기본 동기 연산 외에도 FastAPI는 async/await을 사용한 함수 선언을 지원합니다. WebSocket 지원도 제공하는 Starlette 덕분입니다. 이를 통해 프로그램에 동시성을 추가하여 데이터베이스 쿼리와 같은 느린 작업을 기다리는 동안 애플리케이션이 다른 작업을 수행할 수 있습니다.
  • 데이터 유효성 검사 지원: FastAPI는 Python의 데이터 유형 힌트를 활용하여 데이터를 구문 분석하는 동안 엄격성을 유지합니다. 이렇게 하면 잘못된 데이터 유형이 데이터베이스에 입력되는 것을 방지할 수 있습니다. 따라서 추가 유효성 검사 라이브러리가 필요한 동적 모델과 달리, Pydantic는 FastAPI에서 간단하고 쉽게 사용할 수 있습니다.
  • 완전히 표준화되었습니다: FastAPI는 웹에서 HTTP API를 제공하기 위한 OpenAPI 사양을 준수하므로 소비자 앱과 클라이언트가 사용하고자 하는 API를 쉽게 이해할 수 있습니다. 또한 내부적으로 JSON 스키마 선언을 사용하여 테스트 및 실제 사용자가 제출한 데이터가 데이터베이스에 제출하기 전에 유효한지 확인합니다.
  • 유연성: Django와 달리 FastAPI는 개발자를 특정 코드베이스 아키텍처 표준으로 제한하지 않습니다. 대신 개발자에게 그 결정을 맡깁니다. 따라서 유연한 명명 규칙을 사용하여 코드베이스를 설계하고 이동 중에도 일반적인 앱 설정 및 단위 테스트 세트를 선언할 수 있습니다. 코드 모듈화 및 SOC(분리된 관심사)도 간단합니다.

    또한 권장하는 객체 지향 프로그래밍(OOP)을 사용하는 경우 엔드포인트 클래스에 모델을 쉽게 구성할 수 있습니다. 빌드할 때 경로에 API 엔드포인트를 추가하는 것도 간단합니다.
  • 학습 곡선이 쉽습니다: Flask나 Django와 같은 프레임워크에 비해 사용자 커뮤니티는 작지만, FastAPI는 광범위하고 포괄적인 문서와 튜토리얼이 돋보입니다. 특히 Python이나 JavaScript와 같은 개발 배경 지식이 있다면 쉽게 익힐 수 있습니다. 전반적인 단순성과 유연성 덕분에 개발 프로세스를 더 빠르게 진행할 수 있습니다.

제한 사항

  • 낮은 커뮤니티 지원: FastAPI는 Django나 Flask만큼 사용자가 많지 않습니다. 아직 비교적 새롭기 때문입니다. 따라서 커뮤니티 지원이 낮으며, 특히 신규 개발자에게는 어려울 수 있습니다.
  • 제한된 버전 호환성: FastAPI는 Python 3.6 이상부터 시작하여 이후 버전의 Python만 지원합니다. 따라서 Python 3.6 이전 버전을 실행하는 머신이나 서버는 업그레이드해야만 FastAPI를 성공적으로 설치 및 실행할 수 있습니다.

FastAPI 배포 옵션

서비스형 인프라(IaaS) 및 서비스형 컨테이너(CaaS)는 애플리케이션 배포를 위한 확장 가능한 클라우드 인프라입니다.

가상 프라이빗 서버(VPS)나 공유 호스팅을 통해 FastAPI 애플리케이션을 배포할 수 있지만, IaaS나 CaaS만큼 확장성이 뛰어난 것은 없습니다.

IaaS

IaaS는 클라우드에서 온디맨드 컴퓨팅 리소스를 제공하는 플랫폼입니다. 일반적으로 종량제 방식으로 애플리케이션을 위한 배포 서버를 설정하는 데 필요한 모든 가상화된 리소스를 제공합니다.

IaaS에는 컴퓨팅 인프라 외에도 스토리지 및 로드 밸런서, VPN, 방화벽, DNS 관리 등과 같은 기타 네트워크 리소스가 포함됩니다. 사용자는 컴퓨팅 환경을 관리할 책임이 있으며 애플리케이션의 요구 사항에 맞게 리소스를 사용자 지정하거나 확장할 수 있습니다.

CaaS

CaaS는 클라우드에 애플리케이션을 컨테이너로 배포할 수 있는 서비스형 플랫폼(PaaS)입니다. IaaS와 달리 CaaS는 애플리케이션을 호스팅하는 데 필요한 모든 계산 기준을 내부에서 관리합니다.

여기에는 컨테이너 런타임 환경, 오케스트레이션, 스토리지, 로드 밸런싱 등이 포함됩니다. 따라서 인프라 관리에 신경 쓰지 않고 애플리케이션 구축에만 집중할 수 있습니다.

애플리케이션을 컨테이너로 배포하기 때문에 기술적인 구성에 대한 걱정 없이 간편하게 CI/CD를 통합할 수 있습니다. 따라서 애플리케이션 릴리스 및 업데이트가 더욱 빨라집니다.

빠른 API 배포 프로세스

전제 조건부터 시작하여 배포 프로세스를 단계별로 살펴보겠습니다. 하지만 Back4App 컨테이너를 사용하여 FastAPI 애플리케이션을 배포할 것이므로 계속 진행하기 전에 컨테이너가 무엇인지 간단히 살펴보겠습니다.

Back4app 컨테이너 개요

Back4App 컨테이너는 클라우드에서 도커화된 애플리케이션을 빠르게 배포할 수 있는 클라우드 플랫폼입니다. 이 플랫폼은 GitHub 리포지토리와 동기화되며 릴리스를 푸시할 때마다 배포를 자동으로 업데이트합니다. 따라서 수동 컨테이너 업데이트와 서버 다운타임을 없애는 데 도움이 됩니다.

Back4App 컨테이너를 사용하면 로컬 머신에서 코드와 후속 릴리스를 GitHub로 푸시하기만 하면 플랫폼에서 컨테이너 이미지 오케스트레이션을 내부적으로 처리합니다. Back4App은 실시간 배포 추적 및 실시간 로깅 기능도 제공합니다.

따라서 배포 단계를 추적하고 실패 지점이 있는 경우 이를 확인할 수 있습니다. 또한 Python과 같이 해석된 언어에서 발생할 수 있는 런타임에 앱이 충돌하는 경우 실시간 로깅을 통해 콘솔에서 오류를 추적하여 신속하게 수정할 수 있습니다.

Back4App의 주요 기능은 다음과 같습니다:

  • Back4App 앱을 GitHub의 코드베이스 리포지토리와 쉽게 동기화할 수 있습니다.
  • 코드와 후속 업데이트를 GitHub 리포지토리에 푸시하여 Back4App 컨테이너를 통해 애플리케이션을 클라우드에 배포하세요.
  • Docker파일만 있으면 됩니다. Back4App이 모든 종속성 설치를 처리합니다.
  • 배포 및 후속 릴리스 중에 환경 변수를 쉽게 암호화하세요.
  • 배포를 실시간으로 모니터링하고 롤백을 관리하세요.
  • 실시간 로그를 통해 애플리케이션 사용 내역을 모니터링하세요.
  • 모바일 및 웹 애플리케이션을 클라우드에 배포

Python 다운로드 및 설치

이 블로그에서는 Python 3.10.6을 사용하겠습니다. 하지만 3.6 이전 버전의 Python을 사용할 수 있습니다. 아직 설치하지 않았다면 python.org로 이동하여 사용 중인 OS에 호환되는 최신 Python 버전을 다운로드하여 설치하세요. 그렇지 않은 경우에는 이 섹션을 무시하세요.

Python 랜딩 페이지 다운로드

다운로드가 완료되면 설치 파일을 클릭하고 화면의 지시에 따라 로컬 컴퓨터에 Python을 설치합니다.

시스템 변수 경로에 Python을 추가하려면 Python을 명령줄을 통해 실행할 수 있는 경로에 추가하기 옵션을 선택해야 합니다.

Python 설치 메뉴

Mac을 사용하는 경우 이미 Python 2.7이 기본으로 제공됩니다. 터미널을 통해 홈브루를 사용하여 최신 버전으로 업데이트할 수 있습니다:

brew install python3

터미널에서 다음 명령을 실행하여 Python 버전을 확인합니다.

python --version

Python 가상 환경 활성화 및 FastAPI 설치

그런 다음 새 프로젝트 디렉터리를 만들고 이 폴더에 대한 명령줄을 엽니다. 그런 다음 venv를 사용하여 Python 가상 환경을 활성화합니다.

이 패키지는 Python과 함께 제공되며 별도의 설치가 필요하지 않습니다. 이 패키지를 사용하면 Python 종속성을 전역에 설치하지 않고 개별적으로 관리할 수 있습니다.

터미널에서 다음 명령을 실행하여 가상 환경을 생성하고, env_name을 원하는 환경의 이름으로 바꿉니다.

py -m venv env_name

다음 명령을 실행하여 가상 환경을 활성화합니다.

.\env_name\Scripts\activate

FastAPI 및 Uvicorn 설치

다음 단계는 활성 가상 환경에 FastAPI 프레임워크와 Uvicorn 서버 런타임을 설치하는 것입니다. 이렇게 하면 Pydantic과 Starlette도 설치됩니다.

프로젝트 루트에 요구사항.txt 파일을 생성하고 아래와 같이 설치할 패키지를 입력합니다.

fastapi
uvicorn

아래는 VSCode의 데모입니다. 필요에 따라 이 파일에 더 많은 종속성을 추가할 수 있습니다.

요구 사항이 있는 VS 코드

터미널에서 다음 명령을 실행하여 나열된 종속성을 설치합니다. 가상 환경이 여전히 활성화되어 있는지 확인합니다.

pip install install -r requirements.txt

이 명령은 아래와 같이 지정된 패키지를 설치합니다.

명령줄 종속성 설치

설치가 완료되면 다음 명령을 사용하여 요구 사항.txt를 업데이트합니다:

pip freeze > requirements.txt

위의 명령은 올바른 버전 번호를 포함하여 설치된 종속성을 요구 사항.txt에 덮어씁니다. 가상 환경에 새 종속 요소를 설치할 때마다 이 작업을 수행해야 합니다.

업데이트 후 요구 사항.txt 파일은 다음과 같이 표시됩니다:

프로젝트 소개

간단한 “Hello World” FastAPI 애플리케이션을 작성하고 무료 Back4App 컨테이너를 사용하여 배포해 보겠습니다. 프로젝트가 복잡하더라도 걱정하지 마세요. 배포는 동일한 단계로 진행되며, 월별 가동 시간도 무료로 제공됩니다.

그러나 앱이 매일 많은 요청을 처리하는 경우에는 배포 후 업그레이드하여 방문자에게 다운타임 없이 원활한 사용자 경험을 제공할 수 있습니다.

앱 코드

프로젝트 루트 폴더에 새 라우터 디렉토리를 만들고 그 디렉터리 안에 main.py 파일을 만듭니다. 이 파일은 애플리케이션 API 엔드포인트와 라우터를 처리합니다. 배포할 프로젝트가 이미 있는 경우 다음 섹션으로 건너뛰세요.

다음은 “Hello World” 코드입니다:

from fastapi import FastAPI, APIRouter
import uvicorn

app = FastAPI()
class HelloWorld():
    def read_hello(self):
        return {"data": "Hello World"}
router = APIRouter()
router.add_api_route('/api/v2/hello-world', 
endpoint = HelloWorld().read_hello, methods=["GET"])
app.include_router(router)

if __name__ == "__main__":
   uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

uvicorn 서버를 실행하고 헬로월드 API 엔드포인트를 테스트하려면 명령줄을 통해 main.py 파일을 실행합니다:

python main.py

그러면 지정된 대로 포트 8000에서 개발 서버가 시작됩니다.

이 요청은 GET 요청이므로 모든 웹 브라우저에서 직접 테스트할 수 있습니다. 아래는 그 결과입니다.

앱 도커화

다음으로 프로젝트 루트 폴더에 Docker파일을 만듭니다. VS Code에서 새 파일을 만들고 이름을 Dockerfile로 지정하면 됩니다.

이미지가 생성되면 다음 명령을 입력하여 Docker 이미지를 빌드합니다:

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

GitHub로 푸시

GitHub 계정으로 이동하여 리포지토리로 이동합니다. 오른쪽 상단의 새로 만들기를 클릭하여 새 리포지토리를 시작합니다.

GitHub 계정으로 이동하여 리포지토리로 이동합니다. 오른쪽 상단의 새로 만들기를 클릭하여 새 리포지토리를 시작합니다.

이미 GitHub에 코드를 푸시한 경우 로컬 컴퓨터의 복사본에 Docker파일을 추가하고 리포지토리에 다시 푸시하세요.

새 리포지토리 GitHub

리포지토리에 이름을 지정하고 오른쪽 하단의 리포지토리 만들기를 클릭합니다.

그런 다음 그림과 같이 init 명령을 사용하여 로컬 리포지토리를 초기화합니다:

git init

리포지토리에 푸시하지 않으려면 .gitignore를 사용하여 venv 폴더와 .env 파일을 무시하세요. 이렇게 하려면 프로젝트 루트 폴더에 .gitignore 파일을 만들고 아래와 같이 무시할 폴더와 파일을 입력하세요.

터미널에서 다음 명령을 차례로 실행하여 코드를 리포지토리에 푸시하세요.

1. git add .
2. git commit -m "commit message"
3. git branch -m main
4. git remote add origin <URL of the created repository>
5. git push -u origin main

Back4App 컨테이너로 앱 배포하기

아직 Back4app 계정을 만들지 않았다면 새 계정을 만들어야 합니다. 프로세스를 빠르게 진행하려면 Google 또는 GitHub 로그인 옵션을 사용하세요.

백4앱 가입하기

로그인한 후 새 앱 만들기 위젯을 클릭합니다.

새로운 앱 대시보드 Back4App

서비스형 컨테이너로 이동합니다.

서비스형 컨테이너

다음 페이지에서 GitHub 리포지토리 가져오기를 클릭합니다. 메시지가 표시되면 Back4App을 인증할 수 있는 권한을 GitHub에 부여합니다.

열린 모달의 리포지토리 액세스에서 리포지토리 선택을 클릭합니다. 배포하려는 프로젝트가 포함된 리포지토리를 선택하고 저장을 클릭합니다.

Back4App이 선택한 리포지토리를 자동으로 동기화합니다. Back4App으로 리디렉션되면 추가된 GitHub 리포지토리 오른쪽에 있는 선택을 클릭합니다. 다음으로 앱 이름 필드에 원하는 앱 이름을 입력합니다.

앱 이름 필드 구성

FastAPI 애플리케이션에 .env 파일 안에 비밀이 마스킹되어 있는 경우 환경 변수를 클릭하여 환경 변수를 입력합니다. 변수 추가를 클릭하고 대문자를 사용하여 변수 이름을 입력합니다.

이름 오류를 방지하려면 프로젝트의 .env 파일에 있는 변수와 동일한 명명 규칙을 사용해야 합니다.

이 단계에서는 변수 값을 암호화하고 배포에 추가합니다. 마지막으로 앱 생성을 클릭하여 FastAPI 애플리케이션을 배포합니다.

FastAPI 애플리케이션의 배포 인스턴스는 아래와 같이 실행됩니다.

애플리케이션의 라이브 버전을 보려면 왼쪽 사이드바에서 URL을 클릭합니다. 이 경우 https://testapp-omisolaidowu.b4a.run/api/v2/hello-world 으로 이동하면 예상 응답이 반환됩니다.

결론

Python의 FastAPI를 사용하여 애플리케이션을 개발하는 것은 하나의 작업입니다. 하지만 이를 원활하게 배포하여 고객에게 서비스를 제공하는 것은 또 다른 문제입니다.

CaaS는 더 빠른 배포를 지원할 뿐만 아니라 기술적으로도 덜 어렵습니다. FastAPI 애플리케이션을 배포하는 방법을 살펴보았지만 이것이 전부는 아닙니다.

클라이언트 측 애플리케이션을 별도의 컨테이너 인스턴스에 배포하고 생성된 URL을 기본 URL로 사용하여 FastAPI 엔드포인트에 연결할 수 있습니다.

이 글이 마음에 드셨다면 Flask 애플리케이션을 배포하는 방법에 대한 튜토리얼을 확인해 보세요.

FastAPI란 무엇인가요?

FastAPI는 Python으로 RESTFul API를 개발하기 위한 고성능 웹 프레임워크입니다.

FastAPI 애플리케이션을 어떻게 배포하나요?

– Dockerfile을 사용하여 프로젝트에 대한 Docker 이미지를 만듭니다.
– 코드를 GitHub에 푸시합니다.
– Back4App 계정에 로그인하고 새 앱을 만듭니다.
– 대상 프로젝트를 포함한 GitHub 저장소와 컨테이너 인스턴스를 연결합니다.
– FastAPI 애플리케이션을 배포하고 실시간 배포 로그를 확인합니다.


Leave a reply

Your email address will not be published.