FastApi With AWS Serverless powered by CDK Typescript
Tags: simflexcloud, cdk, serverless, fastapi
Published: 2023-05-21 07:05:20

---
title: FastApi With AWS Serverless powered by CDK Typescript
published: true
description: FastApi With AWS Serverless powered by CDK Typescript
tags: simflexcloud, cdk, serverless, fastapi
cover_image: https://raw.githubusercontent.com/vumdao/simple-serverless-fastapi/master/images/cover.png
---

## Abstract
- Deploy FastAPI in a Lambda function that is fronted by an HTTP API in API Gateway, you can enable API key required for the API

## Table Of Contents
 * [Solution overview](#Solution-overview)
 * [Build FastAPI as lambda funnction handler](#Build-FastAPI-as-lambda-funnction-handler)
 * [Deploy](#Deploy)
 * [Test API](#Test-API)
 * [Conclusion](#Conclusion)

---

## 🚀 **Solution overview** <a name="Solution overview"></a>

<img src=https://raw.githubusercontent.com/vumdao/simple-serverless-fastapi/master/images/architect.png width=900>

- 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 serves API requests and responses.

- Let's see the stack relationships

  <img src=https://raw.githubusercontent.com/vumdao/simple-serverless-fastapi/master/images/diagram.png width=300>

## 🚀 **Build FastAPI as a lambda funnction handler** <a name="Build-FastAPI-as-lambda-funnction-handler"></a>
- 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 `/` and `chat_gpt`
  ```
  @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`
  ```
  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`](https://pypi.org/project/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` correctly
  - For 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** <a name="Deploy"></a>
- 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

  <img src=https://raw.githubusercontent.com/vumdao/simple-serverless-fastapi/master/images/apigw.png width=1100>

  <img src=https://raw.githubusercontent.com/vumdao/simple-serverless-fastapi/master/images/chat_gpt.png width=1100>

- Custom domain mapped to the API

  <img src=https://raw.githubusercontent.com/vumdao/simple-serverless-fastapi/master/images/custom-domain.png width=1100>

## 🚀 **Test API** <a name="Test-API"></a>
- Open API Docs

  <img src=https://raw.githubusercontent.com/vumdao/simple-serverless-fastapi/master/images/api_docs.png width=1100>

- Call `/chat_gpt` with API key and query `question`

  ```
  ➜  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** <a name="Conclusion"></a>
- 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:
- [Simple Serverless FastAPI with AWS Lambda](https://www.deadbear.io/simple-serverless-fastapi-with-aws-lambda/)

---

{% user vumdao %}

{% github vumdao/vumdao no-readme %}