プログラマブログ

by wacul

menu
  • プログラマ
  • Amazon Web Service ELB 謎のヘルスチェックエラー

2014.07.24Amazon Web Service ELB 謎のヘルスチェックエラー

こんにちわ。ワカルでは、サービスの運営などにAmazon Web Serviceを利用しています。

先日、インスタンスは正常なのに、ELBのヘルスチェックがうまく動かなくなる現象に遭遇しました。
結果的に、ELBを同じ構成で作りなおしたところ直ったのですが、根本的な原因がわからないままなので、ログとして残しておこうと思います。
もし原因がわかったら追記します。

起こったこと

今回問題が起こった構成は、以下のようなものです。

1
ELB -> Nginx -> Node.jsアプリ

WebからのリクエストをELBでEC2インスタンス上のNginxに渡し、Nginxのリバースプロキシで、静的ファイル以外を Node.jsのアプリに振り分けます。

この構成で構築後3日ほどすると、サーバーへのリクエストが504(Gateway Timeout) を返すようになりました。 そしてしばらくすると、ヘルスチェックがOut of Service になり時間が経つと戻る、といった挙動を繰り返します。

elb

(参考): CloudWatchの死活監視グラフ

原因調査

ELBのエラーコード説明ページ

上記ページによると、504が返るのは、ヘルスチェックは通っているがサーバーが応答していない時、とのこと。
タイムアウトするようになったあと、ヘルスチェックにも失敗して、インスタンスが切り離されているようです。

エラー箇所を探る

エラーが起こっている箇所を特定するため

1
2
ELB -> Nginx -> Node.jsアプリ
(1)    (2)      (3)
  1. ELB越しでアクセス
  2. Nginx に直接アクセス
  3. Nodeアプリに直接アクセス

の3つを、障害が起こっている時に試しました。
その結果、(1) のみでエラーが起こっている状況を確認しました。

問題は、 (1)ELB か (2)Nginx。またはその間にありそうです。

Nginxの設定を調整してみる

Nginxに直接アクセスした際には問題が起こっていないことから、ELBからの接続にNginxが設定上うまく対応できていない箇所があることを疑いました。

ELBは、外部からのHTTPリクエストごとに接続を貼り直さず、インスタンスに対してKeepAlvieしたコネクションを使いまわしてリクエストしてくれるらしいことを記事でみつけました。

参考: Amazon ELBをうまくつかうには、KeepAliveを有効にしよう。Timeoutは60秒よりだいぶ長くしよう。その背景。

しかし、KeepAliveの値を変えてみるなどしましたが、特に変化なしでした。。

ELB作りなおしたら直った

原因がまったくわからなくなったので、もしやと思い、新しいELBを作り、その下に問題を起こしているインスタンスをつなげてみたところ、なんと問題なく動作しました。

ELBの設定もすべて同じにしたので、いまのところ何が悪かったのかわかっていません。。

気持ち悪さが残りますが、同じような現象かも?と思われるAWSフォーラムへの投稿を発見。みなさん作りなおしたり、AWSのサポートの人に設定をリセット?してもらったりして直っているようです。

参考URL:

はっきりした原因がわからず、少し気持ち悪いですが、また起こらないことを祈りつつ、いったん静観しています。

おしまい

この記事を書いた人tutuming

株式会社ワカルの技術責任者です。フロントエンドからバックエンドまで、ひと通りやってます。最近の興味はチームづくりと、パンづくりです。

waculでは、プログラマを募集しています。

現在はプロダクトとして、課題発見から改善提案まで自動で行うWeb改善プラットフォーム「AIアナリスト」を開発中です。

waculの採用情報へ

ページトップへ