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 连接