aws ec2の自動リブート
TRANSCRIPT
AWS EC2の自動リブート
株式会社アイビス代表取締役社長 神谷栄治
2012/1/6
rebootWatch 開発
自己紹介• 株式会社アイビス 代表取締役社長• ハンドル:かみやん• Twitter : @kamiyan• 好きな言語: Java, C++, Objective-C• 代表作: – ibisBrowser (アイビスブラウザ)– ibisMail (アイビスメール)– ibisPaint (アイビスペイント)
AWS 最高~~~! (^_^)/
rebootWatch 開発経緯
• 物理サーバでは発生していなかったが、 AWS へ移行後、過負荷時に AP(Application Server) が、フリーズ!!• SSH もつながらない!!• AWS 管理画面から EC2 インスタ
ンスを reboot するしかない!
寝られない!!! (^_^)/
監視プログラムrebootWatch を緊急開発せよ!
要件• 1 分に 1 回 cron で起動し、全 AP と
通信ができるか確認し、 5 回連続で通信できない場合は、 EC2 インスタンスをリブートする
• リブート依頼を投げたら管理者にメールで知らせる
• リブート完了し通信が復帰したらリブートにかかった時間を管理者に報告
仕様• AP 追加や AP 削除の度に監視プログラム
を修正するのは面倒!• EC2 インスタンスのタグ付け機能を使っ
て、「 rebootWatch 」タグがついているインスタンスを自動的に監視対象にする
• rebootWatch タグの値を「 8080/ping.jsp 」などのような値とし、「 http://{ 対象の IP}:{ タグの値 } 」にアクセスできるかチェックする
監視対象とするかどうかの ON/OFF が超簡単!(^_^)/
仕様詳細• 言語: Perl ( Ruby にしとけばよかった)• 設置場所:小さめの EC2 ホストか、社内のマ
シン(どっちでもよい)• リブート依頼の連投にならないように 1 度リ
ブート依頼を投げたら 15 分は再依頼しないようにする
• 監視の HTTP リクエストのタイムアウトは 30秒
• 複数台 AP への HTTP リクエストはマルチスレッドとして同時にリクエストして 1 分以内に死活の判断ができるようにする
ファイル設計 – 状態ファイル• 状態ファイルは、 /root/rebootWatch/ に「 { インスタン
ス名( tag:Name) } .txt 」のファイル名で置かれるテキストファイル
• 1 レコードは、「 Time Type Message 」の 3 フィールドで、フィールドはスペース区切り、レコードは改行区切り。Message はオプション。
• Type は、 OK, Timeout, Error, Reboot の 3 種• OK or Timeout or Error レコードが最大 10 件、 Reboot レ
コードが最大 1 件保存される。 HTTP リクエストするたびに上書き保存する
• Timeout or Error が 5 回連続するとリブート依頼を投げる• Reboot レコードは、リブート依頼を投げると追加され、
リブートが完了して復旧するとレコードが削除される
ファイル設計 – ログファイル• 一応、後で調べられるように状態ファイ
ルと同じフォーマットでログファイルを保存しておく
• ログファイルは、「 { インスタンス名 }-YYYYMMDD.txt 」というファイル名で 1 日1 ファイル
実装楽勝~ (^_^)/
試行錯誤• 当初の設計では、「今はメンテナンス中なので、
サービスを停止( Apache や Tomcat を stop )する」などのときに、うっかりホストがリブートすると面倒なので、サービスが立って( LISTEN して)いないときは、リブート依頼を投げない仕様だった
• しかし、実装してみたら AP が過負荷のときにLISTEN しているのに LISTEN していないと応答が来る場合があり、仕様を変更して、 LISTEN してない場合も、リブート依頼を投げることにした
備えあれば憂いなし!これで寝られる~ (^_^)/
• ダウンロード: http://bit.ly/104LVnC