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」は出ていません。たまにしか症状が出ないので確認が出来ていません。