Tech Sketch Bucket of Technical Chips by TIS Inc.

CloudWatch+IFTTTによる監視アラートのソーシャル連携

Pocket

AWS上でシステムを運用する場合、Amazon CloudWatchでシステムを監視させ、障害発生時にCloudWatchから通知を受け取ることで、迅速に障害対応をすることができます。今回はCloudWatchをGmailを介してIFTTTと連携させ、CloudWatchからの通知をソーシャルサービスで受け取る方法について解説します。

統合監視とAmazon CloudWatch

システムダウンやパフォーマンス劣化などに対応するために、 ZabbixHinemos 等を利用した統合監視システムを別途構築する場面は多々あります。しかし統合監視システム自身がダウンしてしまっては意味がないので、統合監視サーバや監視ネットワーク自身も高可用にする必要があり、その構築には手間とノウハウが必要になります。
そのため情報発信サイトのようなシンプルで軽いシステムをクラウド上で運営したい場合には、クラウドベンダが提供する統合監視マネージドサービスを利用したほうが手間がかかりません。

例えばAWSの場合、 Amazon CloudWatch がその統合監視マネージドサービスにあたります。CloudWatchを用いれば、クラウドリソースの利用状況や自作のメトリクスを監視し、監視しているメトリクスが条件を満たした場合にアラームを通知することができます。2014/07にはログファイルの蓄積と監視機能も追加され、CloudWatchはさらに便利になりました。

デフォルトで監視可能な項目や監視データの保存期間、障害を検知した際のアクションのカスタマイズ性など、きっちり構築した統合監視システムに比べれば行き届かない事項も多くありますが、その制限内でも十分なシステムであれば、まず最初にCloudWatchの利用を検討するべきでしょう。

Amazon CloudWatchのアラーム通知

CloudWatchでは、監視メトリクスが指定した期間を超えて設定した条件を満たした場合、AutoScalingポリシーか Amazon SNS(Simple Notification Service) へメッセージを送信することができます(例えばCPU使用率が15分以上80%を超えた場合にメッセージを送信するなど)。AutoScalingポリシーはEC2の起動・停止といった内部的な自律動作のための機能ですので、「システムに何かが起きた」ことを運営者に通知したい場合、Amazon SNSを用いることになります。

このAmazon SNSでは現在、次のようなエンドポイントへメッセージを配信することができます。

  • Amazon SQS(Simple Queue Service)
  • HTTPを用いたWebサービス
  • Email
  • SMS(ショートメッセージ)
  • Google Cloud MessagingやApple Push Notification Service等のモバイルプッシュ通知サービス

残念ながら、現時点では FacebookTwitter 等のソーシャルネットワークサービス、あるいは HipChatSlack といったチャットコミュニケーションサービスなどへ直接メッセージを通知することはできません。Amazon SQSやWebサービスで作りこめば可能でしょうが、いかにも面倒です。

しかし諦める必要はありません。 IFTTTZapier といった、様々なクラウドサービス間を連携するハブサービスを経由することで、簡単にこの問題をクリアすることができます。

IFTTT と Zapier

IFTTTZapier も、何らかのクラウドサービスで発生したイベントをトリガーに、別のクラウドサービスへアクションを起こすハブサービスの一種です。例えばとあるRSSフィードの受信をトリガーに、Twitterアカウントへ自動でつぶやくといった連携が可能になります。

IFTTTとZapierを比べると、IFTTTの方がより簡単に使える反面、自由度は高くないようです。
例えば2014/10時点で対応しているクラウドサービスはIFTTTが130個程度であるのに対し、Zapierは300個を超えています。また同じクラウドサービスに対してでも、Zapierのほうがトリガーが発火する条件をよりきめ細かく設定できるようです。
一方完全に無料で利用できるIFTTTに比べ、Zaiperの無料アカウントでは連携ルールの設定数に上限があり、クラウドサービス間の連携実行回数にも月次で上限があります。

連携したいクラウドサービスや連携内容を考えて、最適なハブサービスを選んでください。今回はIFTTTを用いて、EC2上のLAMPサーバへ構築したCMSのサービスダウンメッセージをFacebook Groupsへ書き込みます。

CloudWatchからFacebook Groupsへの連携

AWS上のシステム障害をCloudWatchで検知し、Facebook Groupsへメッセージを書き込むという一連の流れは、以下のようにクラウドサービスを連携することで実現しています。

CloudWatch_IFTTT.png

システム障害の検知

残念ながらZabbix等の統合監視ツールとは違い、CloudWatchはWebサイトのエンドポイントやプロセスの死活を直接監視することができません。そこで下記のようなスクリプトをcronで5分ごとに実行させ、EC2のインスタンスからCloudWatchへカスタムメトリクスを投げ込むことにします。

このスクリプトでは、トップページをhttpでアクセスしステータスコードが200であることしかチェックしていませんが、取得したHTMLをgrepして適切な文字列が表示されているかなどをチェックしても良いでしょう。

CloudWatchの監視設定

AWS Management ConsoleよりCloudWatchを選択しCustom Metrixを表示すると、上記の監視スクリプトを仕込んだインスタンスから送られてきた Http Status fail のメトリクスを見ることができます。

cloudwatch_01.png

システムが正常に稼働しているため、メトリクスはずっと0のままです。

CloudWatchのアラーム設定

では、CloudWatchでアラームを設定します。Http Status fail のメトリクスが0より大きい(障害発生)状態が2回(10分)連続した場合に、Gmailアカウントへメールを送信します。

cloudwatch_02.pngcloudwatch_03.png

現時点では障害が発生していないため、アラームは起動しません。

IFTTTのレシピ作成

IFTTTにアカウントを作成し、以下の手順でレシピを作成します。

トリガーの設定

My Recipeからトリガーを設定します。 Gmail : New email in inbox from を選択し、Fromアドレスを no-reply@sns.amazonaws.com と指定してトリガーを作成します。これにより、Amazon SNSからメールを受信した際にこのレシピが発火します。

IFTTT_01.pngIFTTT_02.pngIFTTT_03.pngIFTTT_04.png

Gmailのかわりに自動転送設定が可能なMTAに送信する
IFTTTのGmail Channelは15分に1回程度しかinboxをチェックしないため、リアルタイム性は高くありません。IFTTTのトリガー専用アカウント(trigger@ifttt.com)へのメール受信で即座に発火するEmail Channelを用いれば、リアルタイム性を高めることができます。Gmailのメール自動転送機能はPOP/IMAPできないアカウントには転送できないため、この手段は利用できませんが、 trigger@ifttt.com へ自動転送できるValidなメールアカウントが利用できるのであれば、検討してみても良いでしょう。

ZapierのAmazon SNS連携を用いる
ZapierではAmazon SNS連携機能が提供されています。Zapier専用のIAMアカウントを作成してAPIキーを発行する必要があるなど少し設定が面倒ですが、リアルタイム性が必要な場合はZapierの利用を検討しても良いでしょう。

アクションの設定

続いてアクションを設定します。 Facebook Groups : Post a status message を選択し、アクションを作成します。投稿するFacebook Groupsを選択し、Facebook Groupsへ投稿するメッセージの内容を定義します。(メッセージには、トリガーとなったメールの情報を埋め込むことが可能です)

IFTTT_05.pngIFTTT_06.pngIFTTT_07.pngIFTTT_08.png

レシピ完成

このような簡単な手順で、CloudWatchから受信したEmailをトリガーに、IFTTT経由でFacebook Groupsへメッセージを書き込むレシピが完成しました。

障害検知とメッセージ投稿

では、障害を発生させてみます。EC2のインスタンスへSSHでログインし、Apacheを停止しましょう。
10分程度待つとCloudWatchが障害を検知してGmailにメールを送信しました。

cloudwatch_04.png

その後10分程度待つと、IFTTTを経由してFacebook Groupsに次のようなメッセージが無事投稿されました。

Facebook.png

最後に

世の中には便利なクラウドサービスがたくさんあります。要件を満たす適切なクラウドサービスを組み合わせることで、最低限の準備とコストで大きな効果が得られます。もし状況が許すならば、積極的にクラウドサービスを活用すると良いでしょう。

エンジニア採用中!私たちと一緒に働いてみませんか?