AWS Lambda 使用“函数 URL”成功调用,但未使用“API 网关”调用

问题描述 投票:0回答:1

我是 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
,但这也不起作用。

任何建议将不胜感激,谢谢。

amazon-web-services aws-lambda aws-api-gateway fastapi
1个回答
0
投票

仅供未来的新手和我自己,因为我忘记了一切..

  1. 您应该为each路径明确创建“路线”;例如。如果您使用 AWS 控制台(我的意思是,AWS 网站的一部分;我不知道为什么他们称其为“控制台”,但他们就是这么称呼它的)

    API Gateway > Develop > Routes
    ,正如您已经尝试过的那样。

  2. 您应该为each“路线”显式创建“集成”(在上述过程中创建的路线);例如。如果您使用 AWS Web 控制台,

    API Gateway > Develop > Integrations

  3. 即使您通过单击 Lambda Web 控制台图中的“添加触发器”按钮来创建

    (AWS) API Gateway
    ,它也NOT 意味着 Lambda 会自动连接到
    API Gateway
    的所有路由。如果您创建其他路由,那么您应该明确地将这些路由与 Lambda“集成”。

  4. 如果您通过正常方式创建

    API Gateway
    (而不是通过单击Web控制台中Lambda图中的“添加触发器”按钮),那么很自然地认为您应该明确地进行“集成”,因为API网关具有与任何 Lambda 没有关系;当然,这是正确的,去创建路线并为您所做的所有路线创建集成。

  5. 请记住,所有 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”等

© www.soinside.com 2019 - 2024. All rights reserved.