AWS Lambda连接MySQL成功但查询超时(JavaScript)
问题描述
我使用AWS CDK部署了以下JavaScript编写的Lambda代码,不记得对Lambda和安全组配置做过更改,但该代码一个月前可正常运行,现在连接数据库后出现超时问题。代码能够成功连接到DB,但create database查询未执行,随后打印超时异常。
Lambda代码
const client = require("mysql2"); exports.handler = async (event) => { const fn = new Promise((resolve, reject) => { const con = client.createConnection({ host: process.env.host, user: process.env.user, password: process.env.password, port: 3306, }); con.connect(function (err) { if (err) { console.error( `Could not connect to db; host -> ${process.env.host} , user -> ${process.env.user}.` ); return err; } else { console.log("Connected!"); con.query( `CREATE DATABASE IF NOT EXISTS ${process.env.dbName} CHARACTER SET utf8mb4 COLLATE utf8mb4_bin`, function (err, result) { if (err) { console.error(`DB not created: ${process.env.dbName}.`); console.log(result); return err; } console.log(`Database created: ${process.env.dbName}.`); } ); } }); }); return fn .then((e) => { console.log("successful"); console.log(e); }) .catch((e) => { console.error(e); throw e; }); };
日志输出
INIT_START Runtime Version: nodejs:16.v14 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:699b51cc1e44cad9b43e446b3b6f7e0834a78366955dc81cc7b459b0aa3f9175 START RequestId: 983e51b1-0d2f-4d6f-874b-cedf02e5c273 Version: 1 2023-06-16T07:50:04.340Z 983e51b1-0d2f-4d6f-874b-cedf02e5c273 INFO Connected! 2023-06-16T07:50:04.379Z 983e51b1-0d2f-4d6f-874b-cedf02e5c273 ERROR DB not created: 9e58a85f07a54784bc7f6542d29d9343. 2023-06-16T07:50:04.380Z 983e51b1-0d2f-4d6f-874b-cedf02e5c273 INFO undefined 2023-06-16T07:51:04.065Z 983e51b1-0d2f-4d6f-874b-cedf02e5c273 Task timed out after 60.06 seconds END RequestId: 983e51b1-0d2f-4d6f-874b-cedf02e5c273 REPORT RequestId: 983e51b1-0d2f-4d6f-874b-cedf02e5c273 Duration: 60062.80 ms Billed Duration: 60000 ms Memory Size: 128 MB Max Memory Used: 75 MB Init Duration: 268.90 ms
可能原因分析
- Promise未正确决议:代码中创建的Promise从未调用
resolve()或reject()方法,Lambda会一直等待Promise状态变更,直到触发60秒超时限制。即便日志打印了连接成功和创建失败的信息,Promise始终处于pending状态,这是导致超时的核心原因。 - 数据库权限变更:虽然你未修改安全组配置,但数据库侧的用户权限可能被调整,当前执行Lambda的数据库用户已不具备
CREATE DATABASE权限,导致查询执行失败,又因Promise未处理错误,最终引发超时。 - 数据库资源瓶颈:数据库可能出现性能问题,比如CPU/内存占用过高、连接池耗尽等,导致
CREATE DATABASE查询长时间无法完成,触发Lambda超时。 - 回调逻辑未关联Promise状态:在
con.query的回调函数中,无论执行成功还是失败,都没有去更新外层Promise的状态,Lambda无法感知异步操作的结束,只能等待超时。
内容的提问来源于stack exchange,提问作者Pankaj Jangid
相关产品推荐
相关产品推荐

