Функция AWS Lambda работает при тестировании на консоли, но не тогда, когда ее вызывает событие CloudWatch - PullRequest
0 голосов
/ 23 января 2019

Я написал бота в твиттере на узле, который ретвитит некоторые твиты, возвращенные из поиска. Я связал его с Webpack и развернул с помощью AWS Lambda. Я установил событие cloudWatch для запуска функции каждый час. Я зарегистрировал начало и конец функции, а также каждый раз, когда функция успешно / неудачно ретвитит.

Это работает, когда я запускаю его локально. Это работает, когда я тестирую его на консоли управления Lambda. Однако в моих Журналах CloudWatch нет длинных между начальным и конечным журналами. Интересно, что если я уменьшу частоту срабатывания события до <5 минут, он снова заработает. Я очень смущен. Любая идея, как я мог бы исправить это поведение? </p>

Вот логи теста. Функция работает как положено.

START RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Version: $LATEST
2019-01-23T18:18:42.111Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Start
2019-01-23T18:18:42.312Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Error retweeting
2019-01-23T18:18:42.312Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Error retweeting
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Error retweeting
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    End
END RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510
REPORT RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510  Duration: 881.20 ms Billed Duration: 900 ms     Memory Size: 128 MB Max Memory Used: 64 MB  

Вот мой код.

const learnInPublicRetweet = async () => {
  const query = '#SomeHashtag';
  const params = {
    q: query,
    result_type: 'recent',
    lang: 'en'
  };
  console.log('Start');
  let data = await T.get('search/tweets', params);
  const { statuses } = data.data;
  statuses.forEach(async ({ id_str: id, user }) => {
    if (user.id_str !== '1032750379597946880') {
      try {
        await T.post('statuses/retweet/:id', { id });
        console.log(`Retweeted tweet with id ${id}`);
      } catch (err) {
        console.log('Error retweeting');
        console.log(err.message);
      }
    }
  });
  console.log('End');
};

exports.retweet = learnInPublicRetweet;

Вот мои журналы облачных часов


16:44:13 START RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297 Version: $LATEST
16:44:14 2019-01-23T16:44:14.159Z   34df836d-c9b3-4b9a-9547-8f3be7ed5297    Start
16:44:14 2019-01-23T16:44:14.938Z   34df836d-c9b3-4b9a-9547-8f3be7ed5297    End
16:44:14 END RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297

1 Ответ

0 голосов
/ 24 января 2019

Возможно, в вашем коде есть пара вещей неправильных.

  1. Кэширование глобальных переменных, подробнее о лучших практиках

    Попробуйте изменить это: async function learnInPublicRetweet() { ... }

  2. Вы используете цикл forEach, который, я уверен, не работает с асинхронным вызовом. Он отключит все асинхронные вызовы и немедленно вернется. Вы захотите использовать for .. of или for .. in, если перебираете перечисляемые свойства объекта.

...