Отправка ответа на API Gateway от Lambda

Я использую API Gateway-to-Lambda для нескольких микросервисов, но по крайней мере в одном случае служба займет 20-30 секунд, чтобы в таких случаях я хотел бы передать немедленный ответ для клиента, что-то вроде:

status: 200
 message: {
 progressId: 1234
 }

а затем разрешить Lambda Function продолжать (и периодически обновлять "processId" где-то, доступное клиенту. Проблема в том, что если вы вызываете context.succeed(), context.fail() или context.done(), которые, по-видимому, останавливаются лямбда-функции от дальнейшего выполнения, и тем не менее это единственный способ, который я знаю, чтобы сбросить буфер stdout обратно в шлюз API.

Это привело меня ко второму подходу, который я еще не пытался решить (и для простоты хотел бы избежать), который включает в себя API-шлюз, вызывающий функцию "Ответчик" лямбда, которая затем асинхронно срабатывает с Microservice, а затем немедленно отвечает на шлюз API.

Я попытался проиллюстрировать эти два параметра в формате эскиза ниже. Мне бы хотелось услышать, как кто-нибудь смог решить эту проблему.

3 ответа

В настоящее время API Gateway требует, чтобы интеграция AWMS Lambda была синхронной. Если вы желаете асинхронный вызов вашей функции Lambda, у вас есть 2 варианта:

  • Асинхронно вызывать Лямбду либо с интеграцией AWS, вызывающей InvokeAsync на Lambda, либо с помощью промежуточной службы, такой как SNS или Kinesis, для запуска функции Lambda.

  • Вы - диаграмма № 2, используя синхронный вызов Lambda для инициирования асинхронного вызова.


По состоянию на апрель 2016 года можно создать асинхронное выполнение Lambda через шлюз API с помощью AWS Service Proxy. См. http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html


Вы можете отправить заголовок X-Amz-Invocation-Type, он поддерживает асинхронные вызовы с помощью значения Event

Вы можете запросить асинхронное выполнение, указав событие как InvocationType

http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestSyntax

Кроме того, если вы не можете отправить его через свой микросервис, вы можете настроить этот заголовок для передачи по умолчанию с помощью Выполнение метода Запрос интеграции Заголовки HTTP в ресурсе шлюза API

Это сработало для меня в сценарии micro-service -> API Gateway -> Lambda, как указано в вопросе.

licensed under cc by-sa 3.0 with attribution.