Время ожидания AWS Lambda после отправки запроса - PullRequest
0 голосов
/ 19 мая 2019

Я отправляю массив объектов в функцию Lambda AWS, чтобы она могла запустить запрос POST для каждого объекта в массиве, но функция lambda продолжает выдавать ошибку в журнале шлюза API:

Выполнение не выполнено из-за ошибки тайм-аута

Через 30 секунд:

Отправка запроса на https://lambda.ap -southeast-1.amazonaws.com/2015-03-31/functions/...

Я также получаю повторяющийся запрос POST, потому что Lambda повторяет попытки до 5 раз после каждой неудачной попытки и запускается заново в массиве каждыйвремя.

Вот лямбда-функция:

module.exports.shipments = async (event) => {
const axios = require("axios");
let data = JSON.parse(event.body);
let url = data.apiURL + "/api/1.1/wf/bulkshipments";
let patchURL = data.apiURL + "/api/1.1/obj/company/" + data.companyID;
let good = [];
let bad = [];

let promises = data.shipments.map(item =>
  axios.post(url, {
      batchID: data.batchID,
      companyID: data.companyID,
      shipment: item
    })
    //.then( res => good.push({"Order Reference": item.order_reference, "result": res.data}))
    //.catch( error => bad.push({"Order Reference": item.order_reference, "result": error.response.data}))
  );

await Promise.all(promises);

    return {
      statusCode: 200,
      body: JSON.stringify({
        message: 'success',
        totalShipments: data.shipments.length,
        created: good.length,
        errors: bad.length,
        result: {"completed": good, "failed": bad}
      }, null, 2),
    };
};

1 Ответ

0 голосов
/ 20 мая 2019

Вы превышаете ограничение времени ожидания шлюза API (30 секунд) вместо того, чтобы отключить функцию Lambda.

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

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

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

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

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