Tech Sketch Bucket of Technical Chips by TIS Inc.

CloudWatch API + ZabbixでAWS課金情報をグラフ化

Pocket

先日、AWSのCloudWatchで 課金情報を監視・通知できるようになったとのアナウンス がありました。

AWSを利用されている方からすると、
今月いくら利用しているのか気になるところだと思うので、
この機能は非常に有り難いのではないでしょうか。

CloudWatchの詳細については こちら にまとめられています。
今回利用する機能は、CloudWatchの「AWS 請求書の予想請求額(Billing)」メトリクスです。

この課金情報の監視については、無料で利用できるようです。

CloudWatchはAWSの状況を監視するには非常に便利ですが、
監視統計データが2週間しか保存できないという制限があります。

そのため、2週間以上前にどういう状況だったのかを確認するには別途監視データを管理する必要があります。

そこで、OSSの統合監視ツールである「Zabbix」を活用し、
CloudWatchで監視している課金情報のデータを管理してみたいと思います。


CloudWatchで課金情報監視を開始

まずは、CloudWatchで課金情報の監視を開始するよう有効化する設定が必要になります。

Amazon Web Services のサイトから「アカウントアクティビティ」のページにアクセスします。

account_activity0.PNG

すると以下の図のようにCloudWatchを使った課金情報の監視を有効化するかどうかの確認メッセージが表示されます。
「Enable now」をクリックして有効化処理を開始します。

account_activity1.PNG

次に、「Security Challenge Questions」の設定がされていない場合には以下の図のように確認メッセージが表示され、
ユーザ情報設定画面に促されます。

account_activity2.PNG

3つの質問と回答をセットしてSaveすれば完了です。

あとは、15分ほど待てば課金情報のデータがCloudWatchから取得できるようになります。

CloudWatch APIを利用してZabbixに課金情報を登録

それではここからCloudWatchAPIを利用して課金データを取得してみたいと思います。

方法については Serverworksさんの技術ブログ が非常に参考になりました。
こちらで作成されているRubyスクリプトを活用し、Zabbixにデータ登録できるようにしてみました。

Rubyスクリプト動作環境の設定

まず、上記のRubyスクリプトを利用するための環境を構築します。
以降、CentOS6.2での環境構築手順を示します。

必要なものは以下になります。

  • ruby,ruby-devel
  • rubygems
  • zbxapi(gemパッケージ)※Zabbix API操作用ライブラリ
  • right_aws(gemパッケージ)※AWS API操作用ライブラリ

Ruby、Rubygemsのインストール

gemパッケージのインストール

以上で環境の構築は終了です。

課金情報取得&Zabbixへの登録用スクリプトの配置

次に、以下のRubyスクリプトをZabbixの外部スクリプトとして配置します。
externalscriptsのディレクトリ配下に以下のcloudwatch_billing.rbファイルを配置して下さい。

配置後、利用される環境に合わせて設定部分を変更して下さい。
変更が必要な部分は以下になります。

設定項目 用途 デフォルト
STARTTIME,ENDTIME CloudWatchAPIで取得するデータの期間を選択 最新の24時間
PERIOD CloudWatchの監視データの間隔指定(秒単位) 300
ZABBIX_SERVER Zabbixサーバのホスト名orIPアドレス 'example.com'
ZABBIX_API_URL ZabbixAPI用URL "http://#{ZABBIX_SERVER}/zabbix/api_jsonrpc.php"
ZABBIX_LOGINID Zabbix APIアクセス用ユーザ名 'admin'
ZABBIX_PASSWORD Zabbix APIアクセスパスワード 'zabbix'
ZABBIX_SENDER_PATH zabbix_senderパス '/usr/bin/zabbix_sender'
LOGDIR このスクリプトのエラーログ出力先ディレクトリ指定 '/tmp/script_logs'
LOGFILE エラーログファイル名指定 "#{LOGDIR}/zabbix_external_script.log"

最後にスクリプトにZabbix起動ユーザが実行できるよう権限を付与して下さい。

このスクリプトの利用方法は以下です。

上記Rubyスクリプトはアカウントの課金情報の月額トータル値と直近24時間分の課金額をZabbixに登録します。
24時間に1度実施することで、1日分の情報をまとめて登録することができます。

このように「外部スクリプト」と「Zabbix Sender」を組み合わせることで、
一度のスクリプト処理で複数の監視結果を登録することも可能になります。
その他、監視したい内容に応じて上記スクリプトをカスタマイズして下さい。

また、Consolidated Billing(一括決済)の設定を実施されている場合は注意して下さい。
上記スクリプトでは、登録しているアカウント全てのトータル課金情報を取得しています。

アカウント毎の課金情報を取得したい場合は、上記スクリプトのget_metric_statisticsの引数のdimentionsに「LinkedAccount」の設定を追加して下さい。
さらに、サービス毎の課金情報を取得したい場合には、「ServiceName」の項目を追記して下さい。

以下、「123456789012」アカウントの「AmazonEC2」の利用料金のみ取得する場合の設定です。

LinkedAccountの情報やServiceNameの情報は、AWS Management Consoleから調べることができます。
以下の図はCloudWatchの画面から課金情報の監視結果を見た図になります。

cloudwatch_manage.PNG

スクリプトを利用する際の注意点として、社内にあるZabbixサーバから利用するなど、
Zabbixサーバがプロキシ経由でしかインターネットアクセスできない場合は、
gemパッケージ「right_aws」内のlib/awsbase/right_awsbase.rbに以下の変更を加えて下さい。

これでAWS APIへのアクセスがプロキシ経由で実施されるかと思います。

Zabbixに課金情報収集用ホスト設定

最後に、Zabbixに課金情報を収集するためのホスト設定を行います。

前提として、上記スクリプトが稼働するZabbix Serverでは、zabbix_senderが利用でき、
Zabbix APIで以下で設定する課金情報収集用ホストの情報が取得できることが条件となります。
Zabbix APIの設定方法などについては こちら をご参考に設定して下さい。

まず、以下ののテンプレートをインポートします。
(Zabbix2.0用のテンプレートです)

zabbix_aws_billing_template.xml

このテンプレートには以下の3アイテムが登録されています。

アイテム名 タイプ キー 説明
AWS Billing Info Check 外部チェック cloudwatch_billing.rb[{HOST.HOST},{$ACCESS_KEY},{$SECRET_KEY}] cloudwatch_billing.rbを定期的に実行するアイテム
Total Billing Zabbixトラッパー aws.billing.total ZabbixSenderで送信された当月トータル課金情報受信用アイテム
Oneday Billing Zabbixトラッパー aws.billing.oneday ZabbixSenderで送信された監視時点から24時間分の課金情報受信用アイテム

次に、このテンプレートを割当てたAWSアカウント用アイテムを作成します。

インタフェースの設定情報は利用しないので、何を設定しても問題ありません。
マクロに以下の2点を登録して下さい。

  • {$ACCESS_KEY} : AWSアクセスキー情報
  • {$SECRET_KEY} : AWSシークレットキー情報

以上で設定は終了です。
以下のように課金情報がグラフ化されます。
また、必要に応じてトリガー設定を変更することで課金状況に応じた処理を行うことが可能になります。

1day_graph.PNG

total_graph.PNG

まとめ

AWSの新機能を利用して課金情報をZabbixで収集してみました。
AWS CloudWatchの機能だけだと、課金情報を監視してアラートメールを送付するといったことしかできなかったり、
2週間しか監視データが保存できなかったりと制限が多いかと思います。
そういった制限をカバーして、より柔軟に管理するためにも外部ツールとの連携は必要なのではないかと思います。
今回は課金情報のみ取得しましたが、
同様の方法でCloudWatchの他の監視情報についてもZabbixで集約可能です。
APIを活用すればより柔軟な管理ができるのではないでしょうか。

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