如何使用AWS CDK Typescript部署FastApi
#python #serverless #fastapi #cdk

简介

在这篇文章中,我将使用基于打字稿的AWS CDK。

先决条件

本文适用于那些具有通过基于打字稿的AWS CDK的经验的人和API网关。

  • 省略了AWS CDK和AWS CLI的设置。
  • 省略了Python设置。
  • 省略了FastApi描述。

开发环境

  • 节点V18.5.0
  • CDK 2.83.1
  • Python 3.11.3

安装以下

pip install fastapi
pip install mangum
pip install uvicorn

创建应用程序

mkdir sample-ts-fastapi
cd sample-ts-fastapi
cdk init --language typescript
npm install @aws-cdk/aws-lambda-python-alpha

参考
@aws-cdk/aws-lambda-python-alpha

定义lambda和api网关

修改lib/sample-ts-fastapi-stack.tsas以下。

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";

import { PythonFunction } from "@aws-cdk/aws-lambda-python-alpha";
import { Runtime } from "aws-cdk-lib/aws-lambda";
import { LambdaRestApi } from "aws-cdk-lib/aws-apigateway";

export class SampleTsPyFastapiStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const apiName = `SampleApi`;
    const lambdaName = `MyLambda`;

    const lambda = new PythonFunction(this, lambdaName, {
      entry: "lambda",
      runtime: Runtime.PYTHON_3_10,
      index: "main.py",
      handler: "handler",
      environment: {},
    });
    const api = new LambdaRestApi(this, apiName, {
      handler: lambda,
    });
  }
}

创建lambda函数

目录和文件结构应如下。
创建main.py and user.py.

lambda/
 ├ main.py
 ├ router/
   └ user.py

main.py

from fastapi import FastAPI
from mangum import Mangum
from .routers import user

app = FastAPI()


@app.get("/", tags=["root"])
async def root():
    return {"message": "Hello World"}

app.include_router(user.router)

handler = Mangum(app, lifespan="off")

user.py

from fastapi import APIRouter


router = APIRouter()

@router.get("/user", tags=["user"])
async def getUser():
    return {"message": "test user"}

让我们尝试以这种状态运行它。

uvicorn lambda.main:app --reload

现在显示在此页面上创建的API。 http://127.0.0.1:8000/docs

部署

  • main.py中的from routers import user修改。 (它没有通过.routers。)
  • 提前启动Docker
cdk deploy

添加lambda层

由于我们使用了FastApi和Mangum,我们创建并添加了两个层。
还有一种方法可以将lambda层与CDK一起部署并部署,但是这次我们通过单独创建它来进行。

  1. 创建S3桶
  2. zip python库
  3. 将zip上传到S3
  4. 复制其对象URL
  5. 从lambda页面创建图层(需要对象URL)
  6. 创建图层后,复制其Arn

对于2和3,例如,以这种方式创建它。

pip install -t python/ fastapi
zip -r layer1.zip python
aws s3 cp layer1.zip s3://{backet name}/layer1.zip

现在我们创建了两个层Fastapi和Mangum,我们可以将它们添加到前面描述的lambda函数中。

从AWS控制台的Lambda页面中,转到功能详细信息页面并添加两个层。从这里以前输入ARN。

这完成了设置。


结论

就是这样,我能够让Python的Fastapi与Lambda一起在基于打字稿的AWS CDK上。

但是,我无法弄清楚为什么在main.py代码中不会通过lambda中的导入路径,除非我这样做。

我是Python的初学者。如果有一种可以执行代码的方法,而不必担心Lambda和本地路径环境之间的路径环境之间的区别,那么如果有人可以告诉我,我将不胜感激。