Получение результатов ответа от асинхронного вызова в AWS лямбда в python - PullRequest
1 голос
/ 01 октября 2019

У меня есть лямбда-функция AWS, которую я могу вызывать синхронно и получить результаты обратно в порядке с кодом ниже

response = lambda_client.invoke(
        FunctionName=FUNCTION_NAME,
        InvocationType='RequestResponse',
        LogType='Tail',
        Payload=payload,
        Qualifier=$LATEST
    )

Ответная нагрузка имеет тип <botocore.response.StreamingBody object at 0x115fb3160> Поэтому я использую приведенный ниже код для извлечения полезной нагрузки, котораяработает нормально.

response_body = response['Payload']
response_str = response_body.read().decode('utf-8')
response_dict = eval(response_str)

Теперь мне нужно асинхронно вызывать лямбду, поэтому я изменяю тип вызова с помощью InvocationType='Event'

Это дает мне ответ с полезной нагрузкой того же типа, что ираньше botocore.response.StreamingBody object но я получаю сообщение об ошибке с этой строкой - response_dict = eval(response_str)

В сообщении об ошибке указано

    response_dict = eval(response_str)
  File "<string>", line 0

    ^
SyntaxError: unexpected EOF while parsing

Чего мне не хватает? Если полезная нагрузка ответа совпадает с типом синхронного вызова, то почему возникает ошибка синтаксического анализа? Любое предложение?

РЕДАКТИРОВАТЬ

Для ясности я понимаю, что если InvocationType='Event', то мы получаем только статус вызова invoke, а не лямбдарезультат функции. В моем случае, однако, мне нужно и то и другое - запустить асинхронный лямбда и получить результат обратно, когда закончите. Как мне это сделать? Записывает ли результат обратно в s3 и периодически проверяет, что единственный вариант?

1 Ответ

2 голосов
/ 01 октября 2019

InvocationType='Event' означает, что вы не получили ответ. Асинхронный лямбда-вызов означает, что вы просто хотите вызвать функцию, а не ждать ответа. Полезная нагрузка ответа от функции отбрасывается службой.

Когда вы вызываете функцию асинхронно, Lambda отправляет событие в очередь. Отдельный процесс читает события из очереди и запускает вашу функцию. Когда событие добавляется в очередь, Lambda возвращает успешный ответ без дополнительной информации. (выделение добавлено)

https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html

Обратите внимание, что упомянутая здесь очередь - это очередь внутри службы Lambda, которую не следует путать со службой Amazon Simple Queue Service (SQS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...