npmパッケージのアップデート
npm update
「npm update」はnpmそのもののアップデートではなく中のパッケージ管理のアップデート
npm本体をアップデートするには
npm update npm
他にも
npm install -g npm@8.3.2
「npm install -g 」の場合@バージョン番号を入れなくてもいいらしいです
Node.js はV8 JavaScriptエンジン上に構築されたJavaScript実行環境です。
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」は出ていません。たまにしか症状が出ないので確認が出来ていません。
Amazon API Gateway がブラウザコンソール画面から[リソース|アクション]「CORS の有効化」画面内[CORS を有効にして既存の CORS ヘッダーを置換]ボタンをクリックすることでCORS有効化されます。然しメソッドの実行設定でLambdaを指定し「Lambda プロキシ統合の使用」チェックしてしまうと「CORS の有効化」が機能しなくなるようです。これはLambda側にヘッダーの制御が渡ったということだと、私は解釈しています。従って、Lambda側でコード内にHTTPヘッダーを書きCORSを有効にする記述をすればCORSとして利用できます。

「Lambda プロキシ統合の使用」をONにした場合、access-control-allow-originが消えてしまいブラウザからAjaxなどでAPIのデータが取得できなくなります。API Gatewayの「Lambda プロキシ統合の使用」をONにした場合はLambda側で下記のように記述します。
exports.handler = async (event) => { // TODO implement const response = { headers: { "Access-Control-Allow-Origin" : "*", "Access-Control-Allow-Credentials" : true }, statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
headersというエレメントを追加し“Access-Control-Allow-Origin”と“Access-Control-Allow-Credentials”を追加します。ヘッダーを確認すると下記のように2行が追加されていました。

上記の処理を行いHTTPヘッダーに上記文字列の確認ができれば、Ajaxなどからデータ取得できます。