AWS Serverless Expressでlambdaの障害が起きて困った話


はじめに

これはServerless2 Advent Calendarの13日目の記事です。

ただ、この記事を書いている今日はもう17日です。。。
この記事を書こう(ホントは別の話を書く予定だった)としていた当日に障害だったので許してください。

自己紹介

  • 株式会社MidfreeのCTOの平田です。
  • 「ETHBOARD」という、書き込むとEthereumという仮想通貨を貰える匿名掲示板サービスを運営しています。
  • 登録せずに書き込みや閲覧ができるので、是非遊びに来てください!!

この記事について

Serverlessの技術詳細というよりは、直近に自分が経験した障害の体験談みたいなものなので、「そんなことあるんだなー」くらいに読んでもらえればと思います。

システム構成

システム構成をとても簡素に書くと上図のような感じです。
フロントもサーバーもaws-serverless-expressを使ってlambda上で動いています。

突然の障害?!

13日(木)14時半ごろから突如、サイトでエラーが頻発するようになる

Githubのissueに同様の事象がいくつか報告されていたため、報告を元に回避方法を調査、検証するが復旧できず

翌朝、lambda側の対応(おそらく)により無事、復旧

詳細

エラー内容

API側のaws-serverless-expressで下記のようなエラーが出ていました。

Error: socket hang up
at createHangUpError (_http_client.js:299:15)
at Socket.socketOnEnd (_http_client.js:391:23)
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9) code: 'ECONNRESET' 

コネクションエラーではあるものの、どういう要因で発生しているかを調べるのがかなり困難でした。
frontが動いているlambdaからapiをコールした時だけエラーが発生していました。(クライアントから呼んでいる箇所は正常)

Githubでのissue

https://github.com/awslabs/aws-serverless-express/issues/199
実際にあがっていたGithubでのissue報告です。
コードを変更していないのにエラーになりだしたと複数報告があがっていて、リージョン固有の障害等でもなさそうということがわかります。
これを見て自分のコードが悪い訳ではなさそうという安堵感と共にどうやって回避すればいいのだろうという絶望感を味わいました。

回避方法

結論からいうと、回避方法がわかる前に復旧しました。

Authorizationヘッダー関連の問題というコメントがあったため、その辺を修正してみるも直らなかったです。
また、node6.10にダウングレードしたら動いたよって人もいたんですが、コード的にかなり大掛かりなため試しませんでした。
(Typescriptで書いてたら簡単に行けたのか、、、とちょっとだけ後悔)

根本原因

どうやらlambda側の問題であることは間違いなさそうですが、まだ不明なままです。
issueにて原因などが公表されたら、後日、記事を更新したいと思います。

まとめ

今回、デプロイしてないのに突如エラーが出始めるという事態が初めてだったので、記事にしてみました。
アクセス増加によるメモリとかスループットとかそういうエラーならまだわかるんですが、安定した環境での突発的なものだったので、実際かなり焦りました。
かなりレアなケースですが、クラウドを使う上でのリスクとして考えておく必要があるなと感じました。

また、ある技術に大きく依存してしまうのはこういうレアなパターンについて回避できなくなるリスクを持ち合わせているので、依存度は色々分散させておくのがいいなと思いました。今回のケースで言えば、おそらくTypescriptで作っていればnode.jsのバージョンを落としてすぐに回避できた可能性があったということです。そのためにTypescriptに移行するというのは違う気がしますが。。。

この記事によって、改めてみなさんのサービスのリスクポイントの把握などに繋がればいいなと思っています。

最後に

現在は安定的に稼働しているので、ぜひETHBOARDに遊びに来てください!!w