Now(now.sh)で「502 BAD_GATEWAY Code NO_STATUS_CODE_FROM_LAMBDA」エラーの原因と対策
公開日: 2019.6.14
ZeitのPasSサービス・Now(now.sh)で、node.jsのAPIを作っていたところ、アクセスしたタイミングによって502エラーが発生したので、原因と解決策をまとめました。
エラー詳細
NowにデプロイしたNode.js製のAPIで、しばらく間をあけてアクセスすると、
An error occurred with this application.
This is an error with the application itself, not the platform.
502: BAD_GATEWAY Code: NO_STATUS_CODE_FROM_LAMBDA
というエラーが発生していました。
最初はたまたまかと思っていたのですが、一定の割合で発生するようになったので、APIとしては致命的だということで、修正をしました。
エラーログ
now CLIをインストールしているのであれば、nowコマンドからエラーログが取れます。
now logs デプロイしたURL
で、出てきたログがこちら。
2019-06-14T00:45:17.967Z f7c11f0d-08db-4f98-89a9-b47ea9e96ae0 Error: Quit inactivity timeout
at Quit.<anonymous> (/var/task/index.js:20017:17)
at emitNone (events.js:106:13)
at Quit.emit (events.js:208:7)
at Quit._onTimeout (/var/task/index.js:3599:8)
at Timer._onTimeout (/var/task/index.js:14386:23)
at ontimeout (timers.js:482:11)
at tryOnTimeout (timers.js:317:5)
at Timer.listOnTimeout (timers.js:277:5)
END RequestId: 88b1fee8-2f62-4ca2-a4f5-d4119b1d3859
「Quit inactivity timeout」ということで、処理は終わっているのにタイムアウトしているのがおかしいのでこのあたりから、エラー原因の目処を立てました。
原因 -> MySQLのコネクションが切れてなかった
node.jsはノンブロッキングなコードでないといけないのですが、前のアクセスの際に何かブロッキングなプロセスが走っていたということが推測されるので、コードを見直しました。
今回のケースでは、MySQL接続のコードで、何も考えずに、async -> await(ブロッキングコード)のところで、サンプルでネットから拾ってきたMySQL接続を閉じる「.end()」を返り値なしで使っていたことで、MySQLのコネクションがクローズされていなかった模様です。
ということで、
con.end();
を
con.end(error => error ? reject(error) : resolve());
に修正したところ、「502: BAD_GATEWAY Code: NO_STATUS_CODE_FROM_LAMBDA」というエラーは出なくなりました。
最初は「This is an error with the application itself, not the platform.(このエラーはプラットフォームのエラーじゃありません、アプリケーション自身のエラーです)」と言われて、そんなわけないだろ!なんて思いましたが、しっかり調べてみると、node.js特有のノンブロッキングコードに慣れていない自分のせいでした。
普段、PHPやらRubyやらを触っていて、DBのコネクトをわざわざ閉じるという習慣がなかったので、それがよくなかったですね。
参考
Code: NO_STATUS_CODE_FROM_LAMBDA using @now/next after upgrading to v2
価格は記載がある場合を除き、すべて税込みです。
関連キーワード
サーバレスの新着記事
- サーバレスCloudflare R2の料金体系・無料枠まとめ 2024.8.21
- サーバレスCloudflare R2をCyberduckで使う方法 2024.7.31
- サーバレスAIの学習ボット・クローラーからサイトを守るメリットとブロックする方法 2024.7.19
- サーバレスCloudFlare Pagesのビルド環境の違い 2024.5.9
- サーバレスCloudflare D1の料金体系・無料枠まとめ 2024.3.25
- サーバレスCloudflare PagesでNuxt3のビルド時に「ENOENT: no such file or directory」エラーの対象方法 2024.3.21
- サーバレスGitlab CLIでpush時に「glab auth not found」となった際の対処方法 2024.3.19
- サーバレスCloudFlare Workers AIの料金体系・無料枠まとめ 2024.2.2