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
価格は記載がある場合を除き、すべて税込みです。
関連キーワード
サーバレスの新着記事
サーバレス複数サイト運営をする際の無料サーバー使いこなし術 2022.9.5
サーバレスHerokuの無料プランが終了へ。移行するならどこがいい? 2022.8.26
サーバレスCloudflare Pages Functionsをローカルでテストする方法 2022.8.12
サーバレスCloudfalre Pagesでリダイレクトを使う方法 2022.8.11
サーバレスCloudflare WorkersとCloudflare Pages Functionの違いと使い分け 2022.8.10
サーバレスCloudinaryの自分のデータを自動でバックアップさせる方法 2022.8.1
サーバレスいまさら聞けないレンタルサーバーとHerokuの違い 2022.5.10
サーバレスCloudflare Pagesでアクセス制限を実装する 2022.4.26