サーバレスのサムネイル

サーバレス

Now(now.sh)で「502 BAD_GATEWAY Code NO_STATUS_CODE_FROM_LAMBDA」エラーの原因と対策

公開日: 2019.6.14

ZeitのPasSサービス・Now(now.sh)で、node.jsのAPIを作っていたところ、アクセスしたタイミングによって502エラーが発生したので、原因と解決策をまとめました。

編集ノート: SERVERSUSでは、パートナーリンクからコミッションを得ています。コミッションが記事の意見や、サービスの評価に影響を与えることはありません。

エラー詳細

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

Quit inactivity timeout : Lambda / node 8.10


価格は記載がある場合を除き、すべて税込みです。

関連キーワード

サーバレスの新着記事