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

AWS Lambda RDS 连接超时

陶胤运
2023-03-14

我正在尝试使用 Node 编写一个 Lambda 函数.js该函数连接到我的 RDS 数据库。该数据库正在运行,可以从我的 Elastic Beanstalk 环境访问。当我运行该函数时,它返回超时错误。

尝试将超时增加到 5 分钟,结果完全相同。

经过一些研究,我得出的结论是,这可能是一个安全问题,但在亚马逊的留档或这个答案中找不到解决方案(这是我在这个话题上唯一能找到的答案)。

以下是安全详细信息:

  • RDS和Lambda都在同一个安全组中。
  • RDS具有所有流量入站和出站规则。
  • Lambda在其角色中具有Amazon onVPCFullAccess策略。

我的代码是:

'use strict';
console.log("Loading getContacts function");

var AWS = require('aws-sdk');
var mysql = require('mysql');

exports.handler = (event, context, callback) => {

   var connection = mysql.createConnection({
        host     : '...',
        user     : '...',
        password : '...',
        port     : 3306,
        database: 'ebdb',
        debug    :  false
    });

    connection.connect(function(err) {
      if (err) callback(null, 'error ' +err);
      else callback(null, 'Success');
    });

};

我得到的结果是:

"errorMessage": "2017-03-05T05:57:46.851Z 9ae64c49-0168-11e7-b49a-a1e77ae6f56c Task timed out after 10.00 seconds"

共有3个答案

鲁洋
2023-03-14

RDS和Lambda都在同一安全组中。

这是关键。默认情况下,不允许在同一个安全组内进行通信。而且你需要明确的允许(E.x sg-xxxxx ALL TCP)。只有当你的lambda试图通过私有ip访问db时,这才会起作用。

如果它试图通过公共 IP 访问它,它将不起作用,您也需要为此打出必要的整体。

但是有更好的方法:

  1. 为您的 lambda 创建单独的安全组
  2. 允许 RDS sg 中端口 3306 上的入站流量(适用于 lambdas sg)。
谈灵均
2023-03-14

我想感谢每一个帮助我的人,这个问题和我想象的不一样。出于某种原因,代码中的< code>callback不起作用,尽管它在AMAZON自己的默认示例中。

工作代码如下:

'use strict';
console.log("Loading getContacts function");

var AWS = require('aws-sdk');
var mysql = require('mysql');

exports.handler = (event, context) => {

   var connection = mysql.createConnection({
        host     : '...',
        user     : '...',
        password : '...',
        port     : 3306,
        database: 'ebdb',
        debug    :  false
    });

    connection.connect(function(err) {
      if (err) context.fail();
      else context.succeed('Success');
    });

};
桓兴腾
2023-03-14

虽然使用context会起作用,但是只需要添加< code > context . callbackwaitsforemptyeventloop = false;到处理程序,然后像这样正常使用回调:

exports.handler = (event, context) => {
  context.callbackWaitsForEmptyEventLoop = false; 
  var connection = mysql.createConnection({
    //connection info
  });
  connection.connect(function(err) {
    if (err) callback(err); 
    else callback(null, 'Success');
  });
};

答案在文档中(我花了几个小时才找到):http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-using-old-runtime.html

在“比较上下文和回调方法”部分,它有一个“重要”注释来解释事情。

纸条的底部写着:

因此,如果需要与上下文方法相同的行为,则必须将上下文对象属性 callbackWaitsForEmptyEventLoop 设置为 false。

基本上,回调继续到事件循环的结束,而不是结束事件循环的上下文。因此,设置回调WaitsFor

 类似资料:
  • 问题内容: 我在代码中使用了RMI: 这些是4个.java文件。 接下来,我编译所有这些文件。然后创建一个using 。之后,我使用来在服务器端启动rmi注册表。然后,我开始使用服务器,最后使用客户端。 但是什么也没发生 客户端抛出的异常是 原因是什么,我该如何解决? 在客户端计算机上,这些是以下.class文件,在服务器端 问题答案: 错误消息说明了一切:您的连接超时。这意味着您的请求在某个(默

  • 代码片段如下所示: 如果有人有决议,请帮忙?

  • **dataframe2:从另一个来源获得的键的Dataframe(这些键是上表中ID列的分区键)-此表中不同键的数量约为0.15万** 现在,此代码总是导致“com.datastax.oss.driver.api.core.servererrors.ReadFailureException:在一致性LOCAL_ONE读取查询期间Cassandra失败(需要1个响应,但只有0个副本响应,1个失败)

  • 我正在使用带有PostgreSQL数据库服务器的桌面应用程序。当我连续10到20分钟不使用应用程序时,数据库连接会断开。我正在使用PostgresqlJDBC进行数据库连接。 请帮我在这个数据库连接超时。 谢谢

  • 我正在使用Java套接字创建加密通信终端。我的问题是,当我通过“localhost”或我的计算机局域网地址连接时,程序连接完美,并按预期工作,但当我使用我的公共IP地址连接时,连接被拒绝,我得到 java.net.连接异常:连接超时:连接java.base/java.net.DualStackPlainSocketImpl.connect0(本地方法)在java.base/java.net.Dua

  • 我在vm上运行rabbitMQ服务器。我正在学习rabbitMQ java教程。它在vm上本地运行良好,但当尝试从主机发送时,我遇到了一个异常 以下是我正在使用的发送代码: 我可以ping服务器在192.168.198.100但我不能访问管理UI在192.168.198.100:15672/ 有人能帮我弄清楚这个问题出了什么问题吗?提前感谢。

  • 在将AndroidStudio 2.3升级到3.0之后,我犯了很多错误,做了很多工作,但都没有成功 错误:无法解析配置“:app:debugCompileClasspath”的所有文件。 无法解析com。Android支持:appcompat-v7:26.1.0。必需:项目:应用无法解析com。Android支持:appcompat-v7:26.1.0。无法分析POMhttps://dl.goog

  • 我想在云运行应用程序中连接云SQL。我使用了golang。这是关于sql连接设置的代码。 我在Cloud Run设置控制台设置了环境变量。delpoy Application后,Cloud Run控制台显示和