AWS障害状況をZabbixで監視

AWSで発生している障害状況をモニタリングするには、AWS Health Dashboardというサイトがあります。
ここでは、各リージョンの各サービス毎に障害が発生していないかの情報を発信しています。
サービスが利用不可になっている状態のお知らせだけでなく、パフォーマンス劣化が発生している状況なども発信しています。
AWS上でサービス運用している方にとって、ここで公開される情報は結構重要です。
いち早く何が起こっているのかに気付くためにもこのサイトの情報は常にチェックしておきたいところです。

しかし、このサイトの最新情報を知るには、ブラウザでこのサイトを確認するか、RSSで配信される情報をチェックするしかありません。
何かあればプッシュ型で通知して欲しいところではないでしょうか。

そこで、このサイトの情報をZabbixで集約し、障害が発生した場合にアラートを上げれるようにしてみます。

実現方式

Zabbixの外部チェック機能を利用します。
外部チェックスクリプトを作成し、スクリプト内でAWS Health DashboardRSSフィードを取得してきます。
取得した結果をzabbix_senderを用いてZabbixに連携します。
Zabbixに登録された新たな情報があればアラート通知を行うことで実現します。

外部チェックスクリプト

RSSフィードを取得する外部チェックスクリプトはこの通り。
※かなり簡易なスクリプトなので、参考程度に使ってください。

aws_health_check.rb

#!/bin/env ruby

require 'rubygems'
require 'feed_tools'

HOST = ARGV[0]
ITEM_KEY = ARGV[1]
INTERVAL = ARGV[2].to_i 
RSS_URL = 'http://status.aws.amazon.com/rss/ec2-ap-northeast-1.rss'
ZABBIX_SENDER = 'zabbix_senderパス'
ZABBIX_SERVER = 'Zabbixサーバホスト名'
ZABBIX_LOGINID = 'Zabbixサーバへのログインユーザ名'
ZABBIX_PASSWORD = 'Zabbixサーバへのログインパスワード'

def send_to_zabbix(zabbix_sender,zabbix_server,host,item_key,value,unixtime)
    cmd = "echo -n -e #{host} #{item_key} #{unixtime} \"#{value}\" | #{zabbix_sender} -z #{zabbix_server} -T -i - >/dev/null"
    if system(cmd)
        return 0
    else
        return 1
    end
end

FeedTools::Feed.open(RSS_URL).items.reverse.each do |item|
    now = Time.now
    last_check = now -INTERVAL   
    if item.published > last_check
        result = send_to_zabbix(ZABBIX_SENDER,ZABBIX_SERVER,HOST,ITEM_KEY,item.title,item.published.to_i)
        if result == 1
            print 'error'
            exit 0
        end
    end
end

print 'ok'

RSS_URLで東京リージョンのEC2サービスのRSSフィードURLを指定しています。それ以外のサービスのものを見たければ変更してください。

設定

今回はrubyスクリプトを書いたので、Zabbix Serverにrubyのインストールが必要です。
加えて、RSSフィード結果をパースするために、feed_toolsというgemパッケージを用いているため、インストールします。

$ sudo gem install feedtools

Zabbixの外部チェックスクリプトの配置場所(externalscriptディレクトリ)に上記のaws_health_check.rbを置きます。

Zabbixに次のホストテンプレートをインポートします。

zbx_exports_templates.xml

インポートしたテンプレートを割り当てたホストを1つ作成します。
これで、Informational messageが発生したときは「情報」として検知、Performance issuesが発生したときは「警告」として検知、Service disruption が発生したときは「重度の障害」として検知するようトリガーが設定できます。

その他

Nagiosではcheck_aws_status.rbというチェック用プラグインを作成されている方があるようです。
https://gist.github.com/1604786