Rock'n'Hack ブログ

それなりハッカーを目指して、もろもろのメモ。bloggerから引っ越しました。

AWSの利用料金をzabbixに登録する


若干の今更感がありますが、とある出来事をきっかけに AWS CloudWatch APIを用いて、
zabbixに利用料金を登録するようにしたのでメモ。


とある出来事

AWS上に構築しているとあるシステムがあるのですが、運用がある程度落ち着いてきているため、
利用料金は月末にざっくり確認するくらいしかやってませんでした。

ある日、何気なく利用料金を確認してみると、なぜか普段よりも $200 くらい高い…。
これはと思いもろもろ確認してみると…

∑(゚Д゚)ガーン

検証用に立てた RDS インスタンスが上げっぱなしだった…しかも2台。。

今まで結構お金を気にして運用していたため、$200 とはいえガックリ…。

そこで、そういえばこんな↓記事を以前見たことを思い出し、

  【AWS発表】 AWSクラウドの利用料金を監視・通知できるように from Amazon Web Services ブログ

このあたり↓のブログを参考にさせて頂き、zabbix に利用料金を登録してみました。

  AWS SDK for Rubyを使ってAWSの課金額を取得する from cohakim's blog

  CloudWatch API + ZabbixでAWS課金情報をグラフ化 from Tech-Sketch

  Zabbix Senderで複数の値を一括登録 from ike-daiの日記


課金状況を CloudWatch から取得できるようにする

まず初めに、課金情報を CloudWatch から取得可能にするには、一つ事務的なステップを踏む必要があります。

AWS Account Activity にアクセスします。

既に自分は設定してしまっているので画像が異なるのですが、
この↓赤枠のあたりをクリックして遷移していくと、15分程度経つとCloudWatchから
確認出来るようになります。




スクリプト作成

AWS SDK for Ruby を使いました。
Zabbix に登録する部分は自分で書く自信が無かったので、zabbix_senderコマンドを使っています。
その形式に合わせるために、文字列をガチャガチャしていますが…。

ちなみに start time を4時間前にしているのは、これは1時間とかだと取得に
失敗するパターンがあり、ある程度安定して取れたのが4時間だった、というのが理由です。

これを実行すると、下記のような形で AWS Billing の値をまるっと取ってきます。

hoge-server AmazonEC2 1369563780 497.7
hoge-server AmazonRoute53 1369563780 0.54
hoge-server AmazonRDS 1369563780 132.89
hoge-server AWSDataTransfer 1369563780 4.43
hoge-server AmazonSNS 1369563780 0.0
hoge-server AmazonS3 1369563780 1.45
hoge-server USD 1369563780 637.0

ただし、これだけでは、zabbix にデータは登録されません。 先に zabbix 側でアイテムを作っておく必要があります。


Zabbixアイテム(トラッパー)作成

これは、それぞれ下記のように普通に登録します。




cronに登録

これで、データを蓄積する準備は出来たので、とりあえずcronに登録して定期実行します。

# send aws-billing-data to zabbix
0 * * * * cd /etc/zabbix/externalscripts; /usr/local/bin/ruby /etc/zabbix/externalscripts/get_aws_billing.rb

↑変な書き方をしているのですが、普通に登録しただけではどうも動かなくて、
この書き方であれば動いたので、そのままにしています。


グラフで確認

データが取れたら可視化、ということで下記のようにサービス毎に積み上げグラフにしてみました。


これだけだと全体金額が若干分かりづらいので、そちらは折れ線で。




おーやはりグラフになるといいですね。
グラフ自体は直近二週間ならCloudwatchでも見れますが、もっと蓄積したい場合はこの方法は良さそうです。

ただ、このきっかけとなったインスタンスの上げっぱなしを防止するにはこれだけだと
ちょっとイマイチ…毎日確認する必要があります。

日々のだいたいの増加量を算出して、それ以上の増加量を検知したらアラート、
とかすれば良さそうですが、それはまた別で…


おしまい。