我们目前正在体验我只能将其描述为AWS Lambda和RDS之间的随机间歇性超时。在部署我们的功能并成功运行它们之后,它们可以随机切换到的超时状态而无需更改配置。需要注意的是,我们还监视数据库连接,并确认我们没有遇到最大连接问题。
以下是我们设置的详细信息:
正在执行的代码(使用Node.JS v.6.10):
const mysql = require('mysql');
exports.dbWrite = (events, context, callback) => {
const db = mysql.createConnection({
host: <redacted>,
user: <redacted>,
password: <redacted>,
database: <redacted>
});
db.connect(function (err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected !');
});
db.end();
};
我们正在使用Node.JS mysql
库,版本2.14.1。
从网络角度来看:
CloudWatch错误:
{
"errorMessage": "connect ETIMEDOUT",
"errorType": "Error",
"stackTrace": [
"Connection._handleConnectTimeout
(/var/task/node_modules/mysql/lib/Connection.js:419:13)",
"Socket.g (events.js:292:16)",
"emitNone (events.js:86:13)",
"Socket.emit (events.js:185:7)",
"Socket._onTimeout (net.js:338:8)",
"ontimeout (timers.js:386:14)",
"tryOnTimeout (timers.js:250:5)",
"Timer.listOnTimeout (timers.js:214:5)",
" --------------------",
"Protocol._enqueue
(/var/task/node_modules/mysql/lib/protocol/Protocol.js:145:48)",
"Protocol.handshake
(/var/task/node_modules/mysql/lib/protocol/Protocol.js:52:23)",
"Connection.connect
(/var/task/node_modules/mysql/lib/Connection.js:130:18)",
"Connection._implyConnect
(/var/task/node_modules/mysql/lib/Connection.js:461:10)",
"Connection.query
(/var/task/node_modules/mysql/lib/Connection.js:206:8)",
"/var/task/db-write-lambda.js:52:12",
"getOrCreateEventTypeId (/var/task/db-write-lambda.js:51:12)",
"exports.dbWrite (/var/task/db-write-lambda.js:26:9)"
]
}
在已经审查过的参考文献中:
总之,这些超时间歇性的事实使得这个问题完全令人困惑。 AWS支持已声明NodeJS-mysql
是第三方工具,并且技术上不受支持,但我知道人们正在使用此技术。
非常感谢任何帮助!
答案 0 :(得分:3)
考虑到RDS连接没有耗尽,运行到特定子网的lambda有可能始终无法连接到db。我假设RDS实例和lambda在不同的子网中运行。调查此问题的一种方法是检查流量日志。
转到EC2 - &gt;网络接口 - &gt;搜索lambda名称 - &gt;复制eni ref然后转到VPC - &gt;子网 - &gt;选择lambda的子网 - &gt;流程日志 - &gt;通过eni ref。搜索
如果你看到&#34; REJECT OK&#34;在您的数据库端口的流日志中,表示网络ACL中缺少配置。
答案 1 :(得分:0)
更新此问题:事实证明,问题与数据库连接是在处理程序内进行的事实有关!由于Lambda和Node的异步性质,这是间歇性超时的罪魁祸首。
以下是修订后的代码:
const mysql = require('mysql');
const database = getConnection();
exports.dbWrite = (events, context, callback) => {
database.connect(function (err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected !');
});
db.end();
function getConnection() {
let db = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME
});
console.log('Host: ' + process.env.DB_HOST);
console.log('User: ' + process.env.DB_USER);
console.log('Database: ' + process.env.DB_NAME);
console.log('Connecting to ' + process.env.DB_HOST + '...');
return db;
}