当前位置: 首页 > 知识库问答 >
问题:

API网关调用Lambda函数时出现间歇状态500错误

常博裕
2023-03-14

我是AWS的新手,我正在尝试制作一个简单的web服务,它可以调用并显示有关我学校课程的信息。我通过RDS设置数据库,编写Lambda函数来处理对数据库的请求,并使用API网关调用每个API。

问题是lambda函数有时会返回错误。My lambda函数成功返回有关大多数课程的信息,但返回了两个课程的连接错误。这种连接错误是随机发生的。有时,根本不会发生错误。

我使用Cloudwatch查看我的控制台,错误消息是“无法读取未定义的属性'query'。请检查Lambda函数代码,然后重试。”。我假设此错误是由于与数据库的连接失败造成的。但是,我的lambda函数在大多数情况下都可以正常工作。

我试图搜索类似的案例,但没有找到。这是我的λ函数。

const mysql = require("mysql");
const config = require("./config.json");

const pool = mysql.createPool({
  host: config.dbhost,
  user: config.dbuser,
  password: config.dbpassword,
  database: config.dbname,                // this is the max number of connections before your pool starts waiting for a release
  multipleStatements : true  
});
exports.handler = (event, context, callback) => {
  //prevent timeout from waiting event loop
  context.callbackWaitsForEmptyEventLoop = false;
  pool.getConnection(function (err, connection) {
    // Use the connection
    connection.query(
      "SELECT * from course where id = " + event.pathParameters.id,
      function (error, results, fields) {
        // And done with the connection.
        connection.release();
        // Handle error after the release.
        if (error) callback(error);
        else callback(null, results[0]);
      }
    );
  });
};

共有2个答案

严稳
2023-03-14

您的代码是lambda函数容器重用功能的牺牲品。

在处理程序中,connection.release()将在每次代码成功执行时释放连接。

必须阅读:

Lambda functions execute in a container (sandbox), which provides isolation from
other functions and an allocation of resources such as memory, disk space, and CPU.
Container reuse is important to understand for more advanced uses of Lambda.
When a function is instantiated for the first time, a new container is initialized and the
code for the function is loaded (we say that the function is cold when this is done for
the first time). If a function is rerun (within a certain period), Lambda may reuse the
same container and skip the initialization process (we say that the function is now
warm), thus making it available to execute code quicker.
胡承载
2023-03-14

您的问题最有可能是RDS连接池——RDS实例越低,它们可以接受的同时连接数量就非常有限,如果它们命中了,它们就会出错。

我建议您设置一些异常处理和日志记录语句(即使只是打印到std out通常会在CloudWatch中结束),以查看错误发生时是什么,而不是依赖于api网关-任何未捕获的异常抛出在Lambda会自动导致api网关出现500错误,除非您有意更改其行为,这使得跟踪发生了什么变得更加困难。

 类似资料:
  • 我在AWS API网关中有一个REST API,它调用Python Lambda函数并返回一些结果。在大多数情况下,此工作流工作正常,这意味着执行Lambda函数并将结果传递回API,API反过来返回200 OK响应。 然而,我很少从API中得到500个错误代码,而Lambda似乎甚至没有执行。response.reason显示:“内部服务器错误”,没有提供其他信息。 在方法或参数格式方面,对AP

  • 我正在使用Lambda和API网关开发几个AWS无服务器应用程序。 有一次,我试图在一个应用程序上执行一个API请求(使用请求python库),该请求来自另一个应用程序中Lambda函数中运行的代码。我得到500服务器错误。从日志中可以看出,API网关后面的Lambda函数根本没有启动。我找不到任何日志可以告诉我发生了什么。 其他详情: API网关受IAM auth保护。 调用lambda有权“执

  • 我试图在aws.lamda-service上的node.js中创建函数,并在函数控制台进行测试,效果良好,但当调用api时,它不能导出到外部,api网关错误“malformed Lambda proxy response”状态错误502 有什么想法吗

  • 我的(非常简单的)代码看起来是这样的: 我将构建好的jar上传到Lambda,并通过创建一个测试事件在AWS控制台中进行测试。它返回正确的响应,正如预期的那样。 但是,我希望API网关调用这个Lambda。我既使用了Lambda代理集成,也定义了自己的主体映射模板。我似乎无法使它工作,我一直得到: 我确定这是一件很简单的事情,我只是错过了一些东西...