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
이제 코드는 더이상 손댈 것이 없다.
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 |
---|