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

ger*_*der 5 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;
};
Run Code Online (Sandbox Code Playgroud)

Dan*_*one 9

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

exports.handler = async (event, context) => {
  context.callbackWaitsForEmptyEventLoop = false;
  ...
};
Run Code Online (Sandbox Code Playgroud)

为什么这么重要?

AWS Lambda中NodeJS运行时的默认行为是等待javascript事件循环为空,然后结束lambda的执行并返回值。您可以在此处阅读有关AWS Lambda和node.js事件循环如何工作的更多信息

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


小智 7

或者您可以关闭 Redis 连接。