FastAPI 서버개발, 서버리스(SERVERLESS) 아키텍처에서 FastAPI 사용하기

최근 몇 년 동안, 서버리스 아키텍처는 개발자들 사이에서 인기를 얻고 있습니다. 이는 전통적인 서버 구축과 관리의 복잡함에서 벗어나, 코드를 작성하고 배포하는 데 집중할 수 있게 해줍니다. 본 글에서는 FastAPI를 활용하여 서버리스 아키텍처를 구축하는 방법에 대해 자세히 설명하겠습니다.

1. 서버리스 아키텍처란?

서버리스 아키텍처는 개발자가 서버를 직접 관리하지 않고 클라우드 서비스 제공업체에 의해 자동으로 스케일링되고 관리되는 웹 애플리케이션을 구축하는 방법입니다. 이 때 사용되는 서버는 일시적이며 불필요한 서버 관리 작업으로부터 해방될 수 있습니다.

서버리스 아키텍처의 장점은 다음과 같습니다:

  • 비용 효율성: 사용한 만큼만 지불하므로, 유지비용이 적고 비용을 절감할 수 있습니다.
  • 자동 확장: 트래픽이 증가할 때 자동으로 리소스를 할당하므로 수요에 맞춰 조정이 가능합니다.
  • 빠른 배포: 개발자는 비즈니스 로직에 집중하고 인프라 관리에서 벗어날 수 있습니다.

2. FastAPI란?

FastAPI는 Python을 사용하여 API를 구축하기 위한 매우 효율적인 웹 프레임워크입니다. 이는 비동기 프로그래밍을 지원하고, 자동으로 OpenAPI 및 JSON Schema 문서를 생성하며, 빠른 성능을 자랑합니다. FastAPI를 선택하는 이유는 다음과 같습니다:

  • 높은 성능: Starlette를 기반으로 하여 높은 처리량을 자랑합니다.
  • 쉬운 사용법: 기초적인 Python 지식만으로도 쉽게 API를 구축할 수 있습니다.
  • 유효성 검사: Pydantic을 사용하여 데이터 유효성을 자동으로 검사합니다.

3. FastAPI와 서버리스: AWS Lambda로 시작하기

FastAPI를 서버리스 아키텍처에서 사용할 수 있는 곳 중 하나는 AWS Lambda입니다. AWS Lambda는 이벤트 기반으로 서버 코드가 실행되는 컴퓨팅 서비스입니다. 이 연재에서는 FastAPI 애플리케이션을 AWS Lambda에서 실행하는 방법을 설명하겠습니다.

3.1. AWS Lambda와 API Gateway 설정하기

FastAPI 애플리케이션을 AWS Lambda에서 실행할 수 있도록 하기 위해, AWS Lambda와 Amazon API Gateway를 설정해야 합니다.

  1. AWS 계정을 만들고 AWS Management Console에 로그인합니다.
  2. 서비스 목록에서 “Lambda”를 선택한 후 “함수 생성”을 클릭합니다.
  3. 함수 이름을 입력하고 런타임을 “Python 3.x”로 설정 후 “함수 생성”을 클릭합니다.
  4. 함수가 생성되면, “API Gateway” 트리거를 추가합니다.

3.2. FastAPI 애플리케이션 코드 작성하기

FastAPI 애플리케이션을 작성해 보겠습니다. 아래 코드는 기본적인 FastAPI 앱의 예입니다.


from fastapi import FastAPI

app = FastAPI()

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

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

위 코드는 FastAPI 앱을 생성하고 두 개의 엔드포인트를 정의합니다. 첫 번째 엔드포인트는 루트 URL로 요청받을 때 “Hello, World!” 메시지를 반환하며, 두 번째 엔드포인트는 아이템 ID와 쿼리 파라미터를 받아 해당 정보를 반환합니다.

3.3. AWS Lambda에 FastAPI 배포하기

AWS Lambda에 FastAPI 애플리케이션을 배포하려면, Zappa라는 도구를 사용할 수 있습니다. Zappa는 Python 웹 애플리케이션을 서버리스 환경에서 손쉽게 배포할 수 있게 도와주는 프레임워크입니다. 아래 단계로 진행해 보겠습니다.

  1. Zappa 설치하기:
  2. pip install zappa
  3. Zappa 설정 파일 생성하기:
  4. zappa init
  5. 배포하기:
  6. zappa deploy

3.4. CORS 설정하기

서버리스 아키텍처에서 FastAPI 애플리케이션이 다른 도메인에서 요청을 받을 수 있도록 CORS(Cross-Origin Resource Sharing) 설정이 필요할 수 있습니다. FastAPI에서는 CORS 미들웨어를 쉽게 추가할 수 있습니다.


from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 허용할 도메인 목록
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
    

4. FastAPI와 데이터베이스 연동하기

FastAPI와 데이터베이스를 연결하여 실제 애플리케이션을 만드는 것도 가능합니다. SQLAlchemy를 사용하여 FastAPI와 관계형 데이터베이스를 쉽게 연동할 수 있습니다.

4.1. SQLAlchemy 설치하기

pip install sqlalchemy databases

4.2. FastAPI로 데이터베이스 CRUD 작업 구현하기


from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

class Item(Base):
    __tablename__ = "items"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    price = Column(Integer)

Base.metadata.create_all(bind=engine)

@app.post("/items/")
async def create_item(item: Item):
    db = SessionLocal()
    db.add(item)
    db.commit()
    db.refresh(item)
    db.close()
    return item
    

4.3. 비동기 데이터베이스 연결

FastAPI는 비동기 작업을 지원하므로, 데이터베이스 연결 시 비동기 ORM 라이브러리를 사용할 수도 있습니다. databases 라는 라이브러리를 활용하여 비동기로 데이터베이스와 연결해 보겠습니다.


import databases

database = databases.Database(DATABASE_URL)

@app.on_event("startup")
async def startup():
    await database.connect()

@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

@app.post("/async-items/")
async def create_async_item(item: Item):
    query = Item.__table__.insert().values(name=item.name, price=item.price)
    last_record_id = await database.execute(query)
    return {**item.dict(), "id": last_record_id}
    

5. 테스트 및 디버깅

FastAPI는 내장된 테스트 클라이언트를 제공하여 API를 쉽게 테스트할 수 있습니다. pytest와 함께 사용해 보겠습니다. FastAPI 앱을 테스트하려면, 다음과 같이 작성할 수 있습니다.


from fastapi.testclient import TestClient

client = TestClient(app)

def test_read_root():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Hello, World!"}
    

6. 결론

FastAPI와 서버리스 아키텍처는 함께 사용될 때 고성능의 비즈니스 로직을 처리할 수 있는 훌륭한 조합이 됩니다. AWS Lambda와 같은 서버리스 플랫폼을 활용하여, 트래픽 변화에 따른 유연한 리소스 관리가 가능합니다. FastAPI의 간결한 문법과 빠른 개발 속도로 인해, 개발자들은 애플리케이션의 구현에 더욱 집중하고 개선할 수 있습니다.

오늘 다룬 내용을 바탕으로 실습을 진행하고, 여러분의 프로젝트에 FastAPI와 서버리스 아키텍처를 접목해 보시기 바랍니다. 빠른 성장과 혁신을 위한 좋은 선택이 될 것입니다.