Асинхронная интеграция с лямбда-прокси - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь вызвать функцию AWS Lambda асинхронной из AWS API Gateway.

У меня есть длительная (2-3 мин) лямбда-функция, и я хочу вызвать эту лямбда-функцию асинхронно из запроса HTTP Post. Я настроил шлюз API как интеграцию Lambda Proxy (так как я хочу передать тело неизмененным в функцию). Это работает нормально, но через 30 с я получаю 504 из-за ограничения времени выполнения шлюза API.

Но мне не удается вызвать функцию async. Согласно документам AWS это возможно, если я установлю хедер "X-Amz-Invocation-Type", но это не имеет никакого значения.

Кто-нибудь знает, возможно ли вызвать функцию async и использовать интеграцию с прокси?

1 Ответ

2 голосов
/ 09 мая 2019

AWS говорит, что возможно, если вы установите заголовок X-Amz-Invocation-Type на Event, но я столкнулся с той же необходимостью несколько месяцев назад, и это не сработало для меня, поэтому я не уверен, что это по-прежнему так илиесли бы это был только я, кто неправильно настроил это.Может быть, вы упускаете то же самое, что и я тогда: я не добавил заголовок InvocationType в запрос на интеграцию, как предполагает документация, так что это очень вероятно для вас, но, тем не менее, я не могу гарантировать, что он работает)

Документация гласит:

Настройка асинхронного вызова Lambda в консоли шлюза API

В запрос на интеграцию добавьте вызов X-Amz-Invocation-Type header.

В запросе метода добавьте заголовок InvocationType и сопоставьте его с заголовком X-Amz-Invocation-Type в запросе интеграции со статическим значением «Event» или выражением отображения заголовкаmethod.request.header.InvocationType.В последнем случае клиент должен включать заголовок InvocationType: Event при отправке запроса к методу API.

Если это работает, тогда вы можете идти.

Однако тогда я создал промежуточную лямбду, которая буквально действовала как посредник для настоящей лямбды.

Существует широкий диапазон параметров для асинхронного выполнения вашей функции, но вам понадобятся две лямбда-функции, независимо от того.

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

const params = {
        FunctionName: 'YOUR_FUNCTIONS_NAME',
        InvocationType: 'Event',
        Payload: JSON.parse(event.body) // this is the event coming from API Gateway
    };
    await lambda.invoke(params).promise(); // await here is only going to wait for the HTTP request to be successful. Once the 2nd Lambda is invoked, it will return immediately

Другой вариант - поместить сообщение в SQS и настроить триггер для запуска Lambda при появлении нового сообщения в очереди SQS.То же самое относится и к уведомлению SNS.

Другие варианты включают Kinesis, DynamoDB Streams и т. Д., Но идея та же: функция, вызываемая через API Gateway, должна быть не чем иным, как прокси для другой Lambda.Как этот прокси будет работать (будь то отправка сообщения в SQS, SNS, прямой вызов другой функции асинхронно и т. Д.), Не имеет значения, какова концепция, позволяющая обойти ограничение в 30 секунд для API-шлюза.

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