Sensuからの通知にAmazon SNSを使う方法

 2014/05/05
このエントリーをはてなブックマークに追加

全国100000人のSensuユーザーのみなさんこんにちは。

SensuではHandlerという機能を使って、イベントデータを受け取った際に異なる処理を行うことができます。 例えば、エラーを検知した場合に、メールを送信したり、IRCに投稿したり、自動で電話をかけたりといったことをするために利用しますし、例えば受け取ったデータを変換して他の処理を行うのにも利用できます。

今回は、このHandlerとAmazon SNSを組み合わせて、障害発生時などにAmazon SNS経由で通知を行う方法を解説します。

Amazon SNSの設定

Sensuの通知にAmazon SNSを利用するには、まず、AWS側でSNSのトピックを作成する必要があります。

まずAWSのマネジメントコンソールにログインして、メニューからSNSを選択します。以下のような画面が表示されます。 ここで、「Create New Topic」をクリックします。

以下のように新規トピックの作成ダイアログが表示されますので、トピック名とトピックに関する説明を入力します。 入力が終わったら「Create Topic」ボタンをクリックします。

トピックの詳細画面が表示されます。ここではトピックのARNやリージョンなどが表示されています。後でARNは必要になります。ここで、このトピックの購読設定を行います。「Create Subscription」ボタンをクリックしてください。

サブスクリプション設定のダイアログが表示されます。サブスクリプションの設定では、HTTPまたはHTTPSの指定URLへの通知や、SQSのキューへのメッセージ登録、メールの送信などが可能ですが、ここでは、Sensuで検知した障害をメールで通知することにしますので、ProtocolではEmailを選択し、Endpointには受信者のメールアドレスを指定します。

入力が終わったらSubscribeボタンをクリックします。すると以下のような画面が表示されます。ここでは、メール通知の設定を行い、受信者に確認のメールが送信されています。

確認のメールは以下のような感じです。このトピックのメールを購読(Subscribe)する場合は、ページ内のリンクをクリックします。

クリックするとブラウザで以下のように表示されるはずです。これでAmazon SNSの設定は完了です。

Amazon SNS用のHandlerのインストール

Amazon SNS通知用のHandlerのインストール

例によってコミュニティプラグインを利用します。

ソースコードはこちらにあります。

なお、動作にはaws-sdkが必要ですので、Sensu Serverに導入済みでない場合は、最初に以下のようにインストールします。

/opt/sensu/embedded/bin/gem install aws-sdk

次にプラグインの配置ですが、Handlerは、Sensu Server側の/etc/sensu/handlers 以下に配置することになりますので、例えば手作業でやるのであれば

cd /etc/sensu/handlers
wget --no-check-certificate https://github.com/sensu/sensu-community-plugins/blob/master/handlers/notification/sns.rb
chmod 755 sns.rb

としてインストールします。

sns.rbで利用する設定ファイルの作成

次にAmazon SNSを利用して通知を行う際の設定ファイルを用意します。

/etc/sensu/conf.d 以下にjsonファイルを配置することで設定を行いますので、例えば、/etc/sensu/conf.d/sns.json といった名前で、以下のようなファイルを作成してください。

{
  "sns": {
    "region": "ap-northeast-1",
    "topic_arn": "arn:aws:sns:ap-northeast-1:999999999999:Sensu",
    "use_ami_role": false,
    "access_key": "AKISUSHIKUITAISUSHIKYUBEE",
    "secret_key": "o0toRoUniIkuraKanPAChiTaiU7giENgawaBincho"
  }
}

それぞれの項目の意味は以下の通りです。

  • region SNSのエンドポイントがあるリージョン名を指定します
  • topic_arn SNSのトピックのARN(Amazon Resource Name)を指定します
  • use_ami_role Sensu Server自体をAmazon EC2上に起動しており、かつそのEC2のインスタンスにSNSを利用するIAM Roleを割り当てている場合はtrueに設定します。trueに設定した場合は、アクセスキーとシークレットキーの管理は不要ですので、その下のaccess_keyとsecret_keyの項目は不要です
  • access_keyおよびsecret_keyは、AWSのAPIを利用するために使われます。ここでは、Amazon SNSの機能だけが使えれば良いので、専用のIAMユーザーを作成して、最小限の権限のみ付与し、そのIAMユーザーのアクセスキーとシークレットキーを使うようにしてください。間違ってもマスターアカウントのアクセスキーとシークレットキーを埋め込んではいけません

Sensu ServerへのHandlerの組み込み

最後にHandler自体をSensuに組み込むために、設定を行います。 同じく/etc/sensu/conf.d ディレクトリ以下に、適当な名前でjsonファイル(ここではhandler-sns.jsonとしました)を作成します。

{
  "handlers": {
    "sns": {
      "type": "pipe",
      "command": "/etc/sensu/handlers/sns.rb"
    }
  }
}

通知の設定

ここまでで、Sensu Server自体にAmazon SNS用のHandlerの組み込みが終わりました。次にやるべきことは、どの監視において、Amazon SNSへの通知を行うのかを設定することです。

まず、通常のチェック用の設定を見てみましょう。これは、commandの箇所にもあるように、cronという名前に合致するプロセスが1つ以上存在することをチェックする設定です。

{
  "checks": {
    "cron_check": {
      "handlers": ["default", "mailer"],
      "command": "/etc/sensu/plugins/check-procs.rb -p cron -C 1 ",
      "occurrences": 2,
      "interval": 60,
      "subscribers": ["all"]
    }
  }
}
  • commandの箇所はクライアント側で実行されるコマンドラインを定義します
  • occurrencesは、何回連続で発生した場合に、イベントが発生したとみなすかを指定する数値です。ここでは、commandで指定した結果が2回連続で警告対象の場合に、検知するように設定しています
  • intervalは何秒間隔で実行するかを指定します
  • subscribersの箇所は、実行対象の指定で、Sensu Client側で、何をsubscribeするかを設定するので、それに合致していれば、このチェックが実施されることを意味します。ここではClient側で、「all」をsubscribeしていれば、そのClient側でチェックが実行されます
  • 最後にhandlerの箇所ですが、この箇所で、検知した場合に実行するhandlerの名前を定義しています。つまり以下の例では、defaultというHandlerとmailerというメール送信のHandlerが既に設定されているということになります。

したがって、今回Amazon SNSによる通知を追加したい場合は、上記のjsonのhandlerの箇所を追加または修正すれば良いということになります。

{
  "checks": {
    "cron_check": {
      "handlers": ["default", "mailer", "sns"],
      "(略)"
      "subscribers": ["all"]
    }
  }
}

これですべての設定が終わりましたので、最後に設定を反映するために、Sensu Serverを再起動します。

/etc/rc.d/init.d/sensu-server restart

今回の例では、cronのプロセスが存在しない場合はアラートが上がるはずですので、Client側で、crondを停止してしばらく待ちます。 すると以下のように、冒頭で登録したメールアドレスあてに、Amazon SNSからの通知が飛んできます。

メール通知とAmazon SNS通知のどちらが良いのか

最後に、メール通知とAmazon SNSを使った通知のどちらが良いのかですが、個人的には、AWS上にSensu Serverを構築しているのであれば、Amazon SNSを使った方が楽なような気がしています。

  • 自分でSMTPサーバを用意する必要がない
  • リターンメールやエラーメールの心配も不要
  • 通知先メールアドレスの管理をする必要がない(これは同報アドレス使って入ればインパクトないんですが)
  • AWS上の他の通知と同じ形に寄せることができる

ということで、Happy Monitoring!!

 2014/05/05
このエントリーをはてなブックマークに追加

サイト内検索


著作

寄稿

Latest post: