Estoy tratando de usar Serverless Framework para implementar una aplicación web Python Fast API. Está relacionado con el problema:
https://github.com/jordaneremieff/mangum/issues/126
Cuando lo implemento sin servidor, sls depoy e invoco la función, recibo el siguiente error:
[ERROR] KeyError: 'requestContext' Traceback (most recent call last): File "/var/task/mangum/adapter.py", line 110, in __call__ return self.handler(event, context) File "/var/task/mangum/adapter.py", line 130, in handler if "eventType" in event["requestContext"]:He probado con python 3.8 y 3.7. No puedo encontrar una resolución en la web para el mismo. También intenté usar los parámetros spec_version=2 (que no es necesario, creo).
Siento que falta algo aquí, el problema está en algún lugar:
Adapter requires the information in the event and request context to form the ASGI connection scope.Me pregunto si alguien tiene FastAPI trabajando en AWS Lambda usando Framework sin servidor.
Mi manejador:
from fastapi import FastAPI from mangum import Mangum app = FastAPI() handler = Mangum(app) @app.get("/ping") def ping(): return {'response': 'pong'}sin servidor.yml:
provider: name: aws runtime: python3.8 stage: dev region: ap-southeast-1 memorySize: 256 functions: ping: handler: ping.handler events: - http: path: ping method: get cors: trueMis requisitos.txt
appnope==0.1.0 backcall==0.2.0 certifi==2020.6.20 chardet==3.0.4 click==7.1.2 decorator==4.4.2 fastapi==0.61.1 h11==0.9.0 httpcore==0.10.2 httptools==0.1.1 httpx==0.14.1 idna==2.10 ipython==7.17.0 ipython-genutils==0.2.0 jedi==0.17.2 mangum==0.9.2 parso==0.7.1 pexpect==4.8.0 pickleshare==0.7.5 prompt-toolkit==3.0.6 ptyprocess==0.6.0 pydantic==1.6.1 Pygments==2.6.1 requests==2.24.0 rfc3986==1.4.0 six==1.15.0 sniffio==1.1.0 starlette==0.13.6 traitlets==4.3.3 typing-extensions==3.7.4.2 urllib3==1.25.10 uvicorn==0.11.8 uvloop==0.14.0 wcwidth==0.2.5 websockets==8.1El problema radica en que el adaptador mangum espera una entrada similar al contenido del event especificado por AWS API Gateway que se muestra aquí . Verá que hay un diccionario requestResponse allí que el adaptador Mangum parece requerir estrictamente para funcionar. Si su evento de AWS Lambda no contiene esa clave, deberá agregar un campo de marcador de posición o construir un nuevo diccionario de contexto para que lo busque.
Esto se puede hacer creando un controlador personalizado como se muestra en esta parte de los documentos de Mangum . Si no le importa especialmente lo que lee el adaptador como contexto, puede obtener una versión funcional con lo siguiente:
def handler(event, context): event['requestContext'] = {} # Adds a dummy field; mangum will process this fine asgi_handler = Mangum(app) response = asgi_handler(event, context) return responseDebe proporcionar al menos los Event data mínimos , como en el ejemplo a continuación, cuando invoque una función lambda basada en FastAPI (por ejemplo, a través de la consola de AWS Lambda -> Evento de prueba):
{ "resource": "/", "path": "/api/v1/test/", "httpMethod": "GET", "requestContext": { }, "multiValueQueryStringParameters": null }Consulte los detalles sobre el formato de evento en https://docs.aws.amazon.com/lambda/latest/dg/services-apigateway.html#apigateway-example-event
La necesidad proviene del adaptador mangum para FastAPI, explicado en la respuesta .