[python] FastAPI에서 프로덕션 환경 설정하기

FastAPI는 강력한 웹 프레임워크로, 개발자들이 웹 애플리케이션을 빠르고 효율적으로 개발할 수 있는 도구입니다. 그러나 애플리케이션을 프로덕션 환경에서 제대로 운영하려면 몇 가지 설정이 필요합니다. 이 블로그 포스트에서는 FastAPI를 프로덕션 환경에 설정하는 방법에 대해 알아보겠습니다.

1. 환경 변수 설정

FastAPI 프로젝트에서는 환경 변수를 사용하여 애플리케이션의 구성 요소를 조정할 수 있습니다. 예를 들어, 데이터베이스 연결 정보, 보안 설정, 로깅 수준 등을 환경 변수로 설정할 수 있습니다.

FastAPI는 python-dotenv 라이브러리를 사용하여 .env 파일에서 환경 변수를 로드할 수 있습니다. .env 파일을 프로젝트 루트 디렉토리에 생성하고, 필요한 환경 변수를 추가해야 합니다.

# .env 파일 내용

DATABASE_URL=sqlite:///test.db
DEBUG=True

이제 FastAPI 애플리케이션에서 환경 변수를 로드하려면, 다음과 같이 .env 파일을 로드해야 합니다.

from dotenv import load_dotenv

load_dotenv()

2. 프로덕션 서버 설정

FastAPI 애플리케이션을 프로덕션 환경에서 실행하려면, ASGI 서버에 FastAPI 애플리케이션을 배포해야 합니다. 몇 가지 인기 있는 ASGI 서버 중에서는 uvicorn이 있습니다. uvicorn은 FastAPI와 함께 사용하기에 이상적인 ASGI 서버입니다.

# 프로덕션 서버 실행 명령어 (uvicorn 사용)

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

위의 명령어는 main 모듈에 있는 app 객체를 FastAPI 애플리케이션으로 사용하여 0.0.0.0 주소의 8000 포트에서 서버를 실행합니다.

3. 로깅 설정

프로덕션 환경에서는 로깅이 매우 중요합니다. 로그는 애플리케이션의 동작 상태를 추적하고, 오류를 디버깅하는 데 도움이 됩니다. FastAPI는 기본적으로 logging 모듈을 사용하여 로깅을 지원합니다.

logging 모듈을 사용하여 로그를 설정하고, 콘솔 또는 파일에 로그를 출력할 수 있습니다. 아래는 예시입니다.

import logging

logger = logging.getLogger("myapp")
logger.setLevel(logging.INFO)

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
logger.addHandler(console_handler)

file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.INFO)
logger.addHandler(file_handler)

위의 코드는 myapp라는 이름의 로거를 생성하고, 레벨을 INFO로 설정합니다. 콘솔 핸들러와 파일 핸들러를 추가하여, INFO 레벨 이상의 로그를 콘솔과 파일에 출력하도록 설정합니다.

4. 보안 설정

프로덕션 환경에서는 보안을 고려해야 합니다. FastAPI는 표준 HTTP 헤더를 사용하여 보안을 강화할 수 있습니다. 아래는 몇 가지 보안 설정을 예시로 보여줍니다.

from fastapi import FastAPI
from fastapi.middleware.security import SecurityHeadersMiddleware

app = FastAPI()

app.add_middleware(SecurityHeadersMiddleware)

위의 코드는 SecurityHeadersMiddleware 미들웨어를 추가하여, 표준 보안 헤더를 애플리케이션에 적용합니다. 이렇게 하면 애플리케이션의 보안 수준을 높일 수 있습니다.

결론

FastAPI를 프로덕션 환경에 설정하는 방법에 대해 알아보았습니다. 환경 변수 설정, 프로덕션 서버 설정, 로깅 설정, 보안 설정 등을 통해 안정적이고 보안성이 높은 애플리케이션을 운영할 수 있습니다. FastAPI는 개발 생산성을 높여주는 강력한 도구이므로, 프로덕션 환경에서도 충분히 활용해보시기 바랍니다.

References