Abstract
- Deploy FastAPI in a Lambda function that is fronted by an HTTP API in API Gateway, you can enable the API key required for the API
Table Of Contents
๐ Solution overview
Use AWS APIGW to build a simple API server with lambda integration
APIGW route paths such as
/api/v1/
and/chat_gpt/
require API key (with usage plan)The lambda function contains FastApi code to serve API requests and responses.
Let's see the stack relationships
๐ Build FastAPI as a lambda funnction handler
Lambda handler source code
โ simple-serverless-fastapi tree src/lambda-handler src/lambda-handler โโโ api โ โโโ api_v1 โ โโโ api.py โ โโโ endpoints โ โโโ users.py โโโ main.py โโโ requirements.txt 4 directories, 4 files
Direct route paths include
/
andchat_gpt
```plaintext @app.get("/") async def root(): return {"message": "FastAPI running in a Lambda function"}
@app.get("/chat_gpt/") async def read_chatgpt(question: str = None): return {"message": f"We got question: {question}"}
* Restructure FastAPI Routing for developing API and optimize source code by using `APIRouter`
```plaintext
src/lambda-handler/api
โโโ api_v1
โโโ api.py
โโโ endpoints
โโโ users.py
from api.api_v1.api import router as api_router
app.include_router(api_router, prefix="/api/v1")
For the lambda function handler, we use
Mangum
python module which is an adapter for running ASGI applications in AWS Lambda to handle Function URL, API Gateway, ALB, and Lambda@Edge events.For building API Docs, one must set the following parameters in
FastApi()
constructor to resolve/openapi.json
correctlyFor API URL using APIGW stage URL, set
root_path
equal to the API stage name, eg.root_path=/AppAPI
For API custom domain
docs_url='/docs', openapi_url='/openapi.json',
๐ Deploy
For production, building CDK pipeline for this is the best practice.
For the demo, I run
cdk deploy
manuallyโ simple-serverless-fastapi cdk deploy โ SimpleFastApiServerless โจ Deployment time: 72.44s
The API GW and method request
Custom domain mapped to the API
๐ Test API
Open API Docs
Call
/chat_gpt
with API key and queryquestion
โ simple-serverless-fastapi curl -X GET -H "Content-Type: application/json" -H 'x-api-key: 6sUnYj8PAw8MKu8O6FqSw1kf1clmC0Fx8ilQhVeO' https://chatgpt.simflexcloud.com/chat_gpt/ -d 'question=how%20are%20you' -G {"message":"We got question: how are you"}
๐ Conclusion
- We created a FastAPI application using AWS Serverless. The user must provide the API key to query request and the API key is associated with the usage plan where we can specify who can access the deployed API stages and methods, and optionally sets the target request rate to start throttling requests.
References: