Заблокированный веб-сервер AioHTTP при вызове AWS лямбда-функции - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь написать веб-сервер на Python с aiohttp, который получает запрос на публикацию и вызывает aws лямбда-функцию с помощью boto3. Все уже работает, но каждый раз, когда веб-сервер получает запрос post, который вызывает лямбда-функцию, он блокируется от выполнения любого другого запроса, пока не вернется лямбда-функция.

webserver.py

from aiohttp import web
from lambdaProcess import invoke_lambda
import json
import asyncio

PORT = 8000
HOST = "0.0.0.0"

routes = web.RouteTableDef()

@routes.get('/healthcheck')
async def test(request):
    print(request)
    return web.Response(text="Healthy")


@routes.post('/send')
async def lambdaRequest(request):
    print(request)
    if request.body_exists:
        body = await request.post()
        code = body.get("code")
        simulation_type = body.get("simulation_type")

        start_date = body.get("start_date")
        end_date = body.get("end_date")

        lambda_response = invoke_lambda(code, simulation_type, start_date, end_date)

        result = json.loads(lambda_response['Payload'].read().decode())

        return web.Response(text=result)


app = web.Application()
app.add_routes(routes)
#web.run_app(app, host='127.0.0.1', port=8080)

async def start_app():
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, host=HOST, port=PORT)
    await site.start()
    print(f"Serving up on {HOST}:{PORT}")
    return runner, site

loop = asyncio.get_event_loop()
runner, site = loop.run_until_complete(start_app())
try:
    loop.run_forever()
except KeyboardInterrupt as err:
    loop.run_until_complete(runner.cleanup())

lambdaProcess.py

import boto3
import json
import sys


def invoke_lambda(code, simulation_type, start_date, end_date):
    """Invoke Lambda function using boto3
    Parameters:
    - bucket: Answer code sent by student
    - dataset: dataset name used by the answer code
    """

    # Set Boto3 Lambda Client
    client = boto3.client('lambda')

    # Dictionary to be posted on the lambda event
    payload = {
        "code": code,
        "simulation_type": simulation_type,
        "start_date": start_date,
        "end_date": end_date
    }

    response = client.invoke(
        FunctionName='teste',
        InvocationType='RequestResponse',
        LogType='Tail',
        Payload=json.dumps(payload)
    )
    return response

Спасибо.

...