FastAPI

FastAPI 와 서버리스(Serverless Framework), 깃헙 액션으로 CI/CD 구현하기

cocojen 2022. 3. 18. 18:26

FastAPI + Serverless framework + Github Action


앞으로 FastAPI로 1) 코드를 작성한 후에 2) 깃헙에 푸시하면 3) 테스트 코드를 돌리고 4) 테스트 코드 통과 시에 aws 람다와 api gateway를 생성/업데이트 하는 플로우를 몇 개의 포스트에 걸쳐 정리하려고 한다.

FastAPI로 api 를 구현하고, 람다와 api gateway 를 간단히 자동으로 생성하기 위해 serverless framework 를 사용하며, CI/CD 를 위해서 깃헙 액션을 사용할 것이다.

 

이번 포스트에서는 FastAPI로 간단한 api 를 생성해 볼 것이다.

FastAPI 공식문서(https://fastapi.tiangolo.com/) 를 참고하면 FastAPI 를 처음 접하는 초심자도 hello world 메시지를 리턴하는 api 를 5분만에 만들 수 있다. 

 

아래의 명령어로 가상환경을 켜고 fastAPI 를 설치하자. 

# commands.txt

python3 -m venv .venv
source .venv/bin/activate
pip install fastapi
pip install "uvicorn[standard]"

다음으로 main.py 파일을 생성하여 다음을 복붙한다.

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


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


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

`uvicorn main:app --reload`

 

명령어를 통해 서버를 띄우면 hello world 를 메시지를 확인할 수 있다.

 

이제 serverless framework 를 설치하고 작성한 헬로월드 함수를 aws lambda 와 api gateway 에 배포해보자.

아 그 전에 mangum 을 설치해서 handler 를 감싸주어야한다. mangum 은 lambda에서 asgi 어플리케이션(fastAPI, starlette 등등) 을 사용하기 위해 고안된 어댑터이다.

 

Mangum 공식문서에 FastAPI에서는 이렇게 사용하라고 나와있다.

pip install mangum 명령어로 mangum 을 설치하고,

위의 코드처럼 fastapi 앱을 감싸주면 끝이다.

 

from typing import Optional
from fastapi import FastAPI
from mangum import Mangum

app = FastAPI()


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


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

handler = Mangum(app)

 

https://www.serverless.com/framework/docs/getting-started

 

Serverless Getting Started Guide

The Serverless Framework documentation for AWS Lambda, API Gateway, EventBridge, DynamoDB and much more.

www.serverless.com

 

이제 코드는 더이상 손댈 것이 없다.

npm install -g serverless 명령어로 serverless 를 설치한다.

그 후 serverless.yml 파일을 생성한다.

 

service: fast-serverless-action

provider:
  name: aws
  runtime: python3.8
  stage: dev
  region: ap-northeast-2

plugins:
  - serverless-python-requirements

package:
  individually: true

custom:
  pythonRequirements:
    dockerizePip: true 
    layer:
      name: app-layer
      description: python app layer
      compatibleRuntimes:
        - python3.8


functions:
  cocojenApp:
    name: test-lambda
    handler: main.handler
    description: 서버리스 람다 테스트
    timeout: 5 # seconds
    memorySize: 128 # mb
    package:
      patterns:
        - "!node_modules/**"
        - "!yarn.lock"
        - "!package-lock.json"
        - "!package.json"
    layers:
      - { Ref: PythonRequirementsLambdaLayer }
    events:
      - http:
          method: any
          path: /{proxy+}

 

그 후 aws console 에서 확인해보자, lambda 가 잘 생성되었다. api gateway 도 자동으로 잘 붙었다.

 

 

'FastAPI' 카테고리의 다른 글

FastAPI 로 파이썬 마이크로서비스  (0) 2022.03.13