Лямбда-выполнение завершается до завершения асинхронного события - PullRequest
0 голосов
/ 31 января 2020

Я сталкиваюсь со странным поведением, когда запускаю Lambda с Node v12. Эта лямбда запускается правилом события cloudwatch.
Его целью является выполнение определенной операции, а затем перепланирование правила, которое будет вызвано после определенного c периода (например, 5 минут).

exports.handler= async function (event, context, callback) {
 console.info('Hello world');
 let nextValue = moment().add(5, 'minutes');
 let cronValue = `cron(${nextValue .minutes()} ${nextValue .hours()} 
 ${nextValue .date()} ${nextValue .month() + 1} ? ${nextValue .year()})`;
  let putRuleParams = {
        Name: RuleName, 
        Description: `Rechedule event`,
        ScheduleExpression: cronValue,
    };
    console.info(`Updating rule ${RuleName}. Params: `, putRuleParams);
    cloudwatchevents.putRule(putRuleParams, function(err, data) {
        if (err) {
            console.error('Error updating rule', err);
        } else {
            console.info('Successfully updated rule', data);
        }
    });
    console.info('After execution');
}

Вывод следующий:

2020-01-31T14:19:07.749Z    97c23991-7710-4d98-accd-943b470d0875    INFO    Updating rule fiv- 
loadpartitions_rule. Params:  {
  Name: 'dummy_rule',
  State: 'DISABLED',
  Description: 'Scheduled on 31-01-2020 14:24 +00:00 to load partitions for generic_amount_tb 
  table.',
  ScheduleExpression: 'cron(24 14 31 1 ? 2020)'
}
2020-01-31T14:19:07.751Z    97c23991-7710-4d98-accd-943b470d0875    INFO    After execution
END RequestId: 97c23991-7710-4d98-accd-943b470d0875
REPORT RequestId: 97c23991-7710-4d98-accd-943b470d0875  Duration: 15639.87 ms   Billed Duration: 
15700 ms    Memory Size: 1536 MB    Max Memory Used: 101 MB Init Duration: 398.67 ms    

Как вы можете видеть, обработчик обратного вызова правила обновления не выполняется, так как выполнение функции заканчивается до завершения события. А в правиле AWS обновление отсутствует. Как я могу сказать Лямбде подождать, пока событие не будет завершено?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

У вас действительно есть два варианта здесь.

  1. Удалите async из вашей функции. Это должно поддерживать работу лямбды до тех пор, пока не закончится событие l oop или не истечет время лямбды.
  2. Измените свой обратный вызов на обещание и await его. Вы можете просто добавить .promise() в конец вызова, и ответом на вызов будут данные, которые вы поместите в свой обратный вызов.

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

1 голос
/ 31 января 2020

Вы не ждете завершения своей функции. Используйте обещанную версию и добавьте ожидание. Попробуйте это

exports.handler = async function (event, context, callback) {
  console.info("Hello world");
  const nextValue = moment().add(5, "minutes");
  const cronValue = `cron(${nextValue .minutes()} ${nextValue .hours()} 
  ${nextValue .date()} ${nextValue .month() + 1} ? ${nextValue .year()})`;
  const putRuleParams = {
    "Name": RuleName,
    "Description": "Rechedule event",
    "ScheduleExpression": cronValue
  };
  console.info(`Updating rule ${RuleName}. Params: `, putRuleParams);
  const response = await cloudwatchevents.putRule(putRuleParams).promise();
  return response;
  console.info("After execution");
};


, вы можете использовать любой из методов aws sdk обещанием, добавив .promise() в конце.

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