为什么我的AWS Lambda函数会一直超时?

时间:2019-04-28 21:38:33

标签: javascript amazon-web-services redis aws-lambda

我有一个运行在node.js 8.10上的AWS Lambda函数。此函数使用ioredis库连接到Redis服务器,并通过键获取值,然后返回该值。我在日志中看到连接成功,并且值已成功检索。但是,响应永远不会返回,如果我查看日志,我会看到lambda总是超时。

为什么这种情况持续发生?出于某种原因,lambda会继续运行而不是从Redis返回值吗?

这是我的lambda函数中的代码:

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 个答案:

答案 0 :(得分:7)

简短的答案:只需设置event.callbackWaitsForEmptyEventLoop = false

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

为什么这很重要?

AWS Lambda中NodeJS运行时的默认行为是等待javascript事件循环为空,然后结束lambda的执行并返回值。您可以阅读有关AWS Lambda and the node.js event loop works here的更多信息。

因此,您的lambda函数当前正在发生的事情是,与Redis的连接使事件循环保持打开状态,从而阻止了函数成功结束执行。

答案 1 :(得分:2)

或者您可以关闭Redis连接。