AWS LambdaのNode.js 12で関数を作成し、npm install mysqlを使ってMySQLデータベースに接続した場合、何度か実行していたらたまに「Internal Server Error」出ていましてLOGを見ると「Unknown application error occurred」と書いていました。
LOGを追っていくと下記のような「Quit inactivity timeout」を発見した。
2020-12-31T09:53:06.051Z 8d702d7b-XXXX-XXXX-99a1-XXXXX231d3ad ERROR Uncaught Exception { "errorType": "Error", "errorMessage": "Quit inactivity timeout", "code": "PROTOCOL_SEQUENCE_TIMEOUT", "fatal": true, "timeout": 30000, "stack": [ "Error: Quit inactivity timeout", " at Quit.<anonymous> (/var/task/node_modules/mysql/lib/protocol/Protocol.js:160:17)", " at Quit.emit (events.js:314:20)", " at Quit._onTimeout (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:124:8)", " at Timer._onTimeout (/var/task/node_modules/mysql/lib/protocol/Timer.js:32:23)", " at listOnTimeout (internal/timers.js:554:17)", " at processTimers (internal/timers.js:497:7)" ] }
原因は、MySQLとのコネクションを切るためのend()でした。
end(callback?: (err?: MysqlError) => void): void; end(options: any, callback: (err?: MysqlError) => void): void;
上記のようになってるので、Promiseでラップした方がいいようでした。
const mysqlEnd = () => { return new Promise((resolve, reject) => { try { mysqlのインスタンス.end({timeout: 3000}, (err) => { if (err) { console.log(err) reject(null) } else { resolve(null) } }) } catch (_e1) { console.log(_e1) } }) }
これで、いまのところ「Internal Server Error」は出ていません。たまにしか症状が出ないので確認が出来ていません。