为什么即使已经调用了API网关回调,我的Lambda函数也会超时?

问题描述 投票:2回答:3

我有一个AWS API Gateway方法,可以将请求代理到AWS Lambda。但是,在日志中使用以下内容三秒钟后出现错误:

转换前的端点响应体:{“errorMessage”:“2017-09-05T16:30:49.987Z 922186c0-9257-11e7-9db3-51921d5597a2任务在3.00秒后超时”}

因此,我继续检查我的Node 6.10 AWS Lambda函数,看看它为何超时。我在每个函数调用之前和之后都添加了日志语句。令人惊讶的是,它完成了它应该做的所有事情:称为API网关回调,然后在数据库之后运行查询。所有需要0.6秒,据我所知,没有其他代码可以运行。然而,它似乎继续运行三秒钟的剩余时间,然后超时。 (我想,这是因为我要打开与数据库的连接。)

我在callback调用之前和之后放置的日志语句表明该调用在不到半秒的时间内执行。然而,该响应似乎没有进入API网关,而三秒后的错误确实如此。

可能是什么原因,我该如何调试呢?

node.js amazon-web-services aws-lambda aws-api-gateway
3个回答
11
投票

默认情况下,在NodeJS Lambda函数中调用callback()函数不会结束函数执行。它将继续运行,直到事件循环为空。当您继续打开数据库连接时,会发生在调用callback之后继续运行的NodeJS Lambda函数的常见问题。您尚未发布任何代码,因此我无法提供具体建议,但您需要确定是否要在代码中打开数据库连接或类似的东西。

或者,您可以通过在callback对象上设置callbackWaitsForEmptyEventLoop = false来更改行为,以便在调用context函数后立即结束执行。


2
投票

您的API网关具有29秒的固定超时。大多数查询都会在此时间范围内完成。将lambda执行超时增加到30秒到3分00秒之间的任何时间。使用context.succeed()而不是回调。这对我有用。

const mysql = require('mysql');
const connection = mysql.createConnection({
  host     : 'your_mysql_host',
  user     : 'your_mysql_user',
  password : 'your_mysql_password',
  database : 'your_mysql_db'
});

exports.handler = (event, context) => {
  var userId = event.params.querystring.userid;
  const sql = 'SELECT * FROM users where USER_ID=' + userId;

  var response = {
    "statusCode": 200, 
    "body": "body_text_goes_here"
  }

  if(userId){
    connection.query(sql, function (error, results, fields) {
      if (error) {
        context.succeed(error);
      } else {
        response.body = results;
        context.succeed(response);
      }
    });
  }
}

0
投票

您需要增加lambda函数超时。默认限制设置为3.0秒的时间,而您的代码需要更多时间来执行。

© www.soinside.com 2019 - 2024. All rights reserved.