我是 AWS 新手。我正在尝试使用 Lambda 部署由 FastAPI 和 Mangum 制作的后端。
如果我使用 Lambda 的“函数 URL”,效果很好,但如果我使用“AWS API Gateway”URL,似乎路径无法正确解析。我做错了什么?
我用类似于以下的代码对其进行了测试:
from fastapi import FastAPI
from mangum import Mangum
app = FastAPI()
# app = FastAPI(root_path = '/default_stage/myFunction')
handler = Mangum(app, lifespan="off")
# handler = Mangum(app, lifespan="off", api_gateway_base_path='/default_stage/myFunction')
@app.get("")
def f1():
return "f1"
@app.get("/")
def f2():
return "f2"
@app.get("/k")
def f3():
return "f3"
@app.get("/myFunction")
def f4():
return "f4"
@app.get("/myFunction/")
def f5():
return "f5"
@app.get("/myFunction/k")
def f6():
return "f6"
@app.get("/default_stage/myFunction")
def f7():
return "f7"
@app.get("/default_stage/myFunction/")
def f8():
return "f8"
@app.get("/default_stage/myFunction/k")
def f9():
return "f9"
我尝试了
FastAPI(root_path = '/default_stage/myFunction')
或Mangum(app, lifespan="off", api_gateway_base_path='/default_stage/myFunction')
,不知何故它似乎与解决方案有关,但我无法弄清楚。
也尝试过在这里和那里更改
API Gateway > Develop > Routes
,但这也不起作用。
任何建议将不胜感激,谢谢。
仅供未来的新手和我自己,因为我忘记了一切..
您应该为each路径明确创建“路线”;例如。如果您使用 AWS 控制台(我的意思是,AWS 网站的一部分;我不知道为什么他们称其为“控制台”,但他们就是这么称呼它的)
API Gateway > Develop > Routes
,正如您已经尝试过的那样。
您应该为each“路线”显式创建“集成”(在上述过程中创建的路线);例如。如果您使用 AWS Web 控制台,
API Gateway > Develop > Integrations
。
即使您通过单击 Lambda Web 控制台图中的“添加触发器”按钮来创建
(AWS) API Gateway
,它也NOT 意味着 Lambda 会自动连接到 API Gateway
的所有路由。如果您创建其他路由,那么您应该明确地将这些路由与 Lambda“集成”。
如果您通过正常方式创建
API Gateway
(而不是通过单击Web控制台中Lambda图中的“添加触发器”按钮),那么很自然地认为您应该明确地进行“集成”,因为API网关具有与任何 Lambda 没有关系;当然,这是正确的,去创建路线并为您所做的所有路线创建集成。
请记住,所有 FastAPI 和 Mangum 的东西都只是助手; Mangum 用于轻松创建处理程序(由 Lambda 调用的可调用函数,接受两个参数
event
和 context
);当然,如果您自己编写处理程序的定义,则不需要 Mangum。如您所知,FastAPI 也是一个助手。换句话说,FastAPI 和 Mangum 都不需要使用 Lambda。
关于 5.,您可以记录 Lambda 处理程序的输入参数
event
和 context
,例如:
appJ = FastAPI()
def my_handler(event, context):
print(f"event:{event}\n")
print(f"context:{context}\n")
print("now Mangum will be used...")
m = Mangum(appJ, lifespan="off")
res = m(event, context)
return res
您可以在 AWS CloudWatch 中查看输出。例如。
event
中,有“rawPath”、“requestContext”、“body”等