RDS 触发器的 Lambda 函数访问导致连接丢失

Posted

技术标签:

【中文标题】RDS 触发器的 Lambda 函数访问导致连接丢失【英文标题】:Lambda function access by RDS trigger creates connection lost 【发布时间】:2020-05-13 09:27:45 【问题描述】:

我在 RDS aurora 中创建了 2 个表:

    test-table 在极光数据库中,值为 id(PK)、tasknumber、status、contactid(FK) contact-table 在同一个数据库中,值为 contactid(PK)、电子邮件、电话

我在“测试表”中创建了一个触发器,每当“状态”发生变化时,触发器都应该调用 AWS-Lambda ARN。

Lambda 函数和 Aurora 具有所有权限,并且已清除安全性,但仍在从 Lambda 进行测试时出现以下图像错误,并在 aurora 中手动更新“状态”字段(通过 Workbench Sql 查询),它显示:

操作失败:将 SQL 脚本应用到数据库时出错。

ERROR 2013: 2013: 在查询期间丢失与 mysql 服务器的连接

我也附上了我的 Lambda Node.Js 代码。

var AWS = require('aws-sdk');
AWS.config.update( region: 'us-east-1' );
const mysql = require('mysql');

var con = mysql.createConnection(

  host: 'correct value',
  user: 'root',
  password: 'correct value',
  port: correct value,
  database: 'correct value'

);
exports.handler = (event, context, callback) => 
  context.callbackWaitsForEmptyEventLoop = false;
  var fk = event.contact_id;
  console.log('FOREIGN KEY=', fk)

  con.connect(function(err) 
    if (err) throw err;
    var sql = `SELECT * FROM db.contacts where contact_id=$fk`

    con.query(sql, function(err, result) 
     if (err) throw err;
     var email = result[0].email;
     console.log(email);

     var sns = new AWS.SNS();
    var params = 
     Message: email,
      Subject: "Test SNS From Lambda",
     TopicArn: "arn:correct value"
   ;

      sns.publish(params, function(err, data) 
        if (err) console.log(err, err.stack); 
        else 
          console.log(data);
          callback(null, 'Success');
        
      );

    );
  );
;
Image1ErrorMySqlWorkbench Image2ErrorLambdaaws

同样适用于 NodeJs 包:https://github.com/isaacs

【问题讨论】:

作为解决方案: - 我增加了 Lambda 函数的超时期限 - 增加了 Lambda 的内存 - 安全组配置:MYSQL/Aurora TCP 3306 0.0.0.0/0 - 更正了 IAM 策略,RDS 和 Lambda相同的 IAM MySql 触发器在条件不满足时工作。我想这是合乎逻辑的,因为当时它不必调用 Lambda ARN 【参考方案1】:

如果你想要即时响应,你必须关闭连接,否则关闭连接需要默认时间,如果有意义请告诉我

【讨论】:

请您详细说明一下,我听不懂。 con.query(sql, function(err, result) if (err) throw err; var email = result[0].email; console.log(email); 尝试关闭连接获取数据后 con.end() - 仍然给出同样的问题。错误是“连接 ETIMEOUT” 他们在同一个vpc中吗? 不,以前没有。刚刚更正它,仍然出现以下错误: >操作失败:将 SQL 脚本应用于 > 数据库时出错。 >ERROR 2013: 2013: 在查询期间丢失与 MySQL 服务器的连接

以上是关于RDS 触发器的 Lambda 函数访问导致连接丢失的主要内容,如果未能解决你的问题,请参考以下文章

从未在 Lambda 函数中调用与 Sequelize 的 RDS 连接

AWS Lambda RDS 连接超时

Python AWS Lambda 为每个部署旋转到 RDS 的新连接

在VPC中访问RDS posgtgreSQL?

RDS 服务触发 Lambda

AWS Lambda NodeJS 连接到 RDS Postgres 数据库