简介
在这篇文章中,我将使用基于打字稿的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一起部署并部署,但是这次我们通过单独创建它来进行。
- 创建S3桶
- zip python库
- 将zip上传到S3
- 复制其对象URL
- 从lambda页面创建图层(需要对象URL)
- 创建图层后,复制其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和本地路径环境之间的路径环境之间的区别,那么如果有人可以告诉我,我将不胜感激。