Я пытаюсь написать веб-сервер на 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
Спасибо.