Почему моя функция AWS Lambda не работает? - PullRequest
4 голосов
/ 29 апреля 2019

У меня есть функция AWS Lambda, работающая на node.js 8.10.Эта функция подключается к серверу Redis с использованием библиотеки ioredis , получает значение по ключу, а затем возвращает значение.Я вижу в журналах, что соединение успешно, и что значение успешно восстановлено.Однако ответ никогда не возвращается, и если я смотрю в журналах, я вижу, что лямбда всегда истекает.

Почему это происходит?Есть ли какая-то причина, по которой лямбда продолжает работать, а не возвращает значение из Redis?

Это код в моей лямбда-функции:

const Redis = require('ioredis');
const redis = new Redis(6379, 'http://redis.example.com');

exports.handler = async (event, context) => {
  const value = await redis.get('mykey');
  console.log('value', value);  // this shows up in Cloudwatch logs
  return value;
};

Ответы [ 2 ]

8 голосов
/ 29 апреля 2019

Краткий ответ: просто установите event.callbackWaitsForEmptyEventLoop = false.

exports.handler = async (event, context) => {
  context.callbackWaitsForEmptyEventLoop = false;
  ...
};

Почему это важно?

Поведение по умолчанию среды выполнения NodeJS в AWS Lambda:подождать, пока цикл события javascript будет пустым, прежде чем завершить выполнение лямбда-выражения и вернуть значение.Вы можете прочитать больше о том, как AWS Lambda и цикл событий node.js работают здесь .

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

2 голосов
/ 29 апреля 2019

Или вы можете закрыть соединение Redis.

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