AWS利用料金グラフ化Muninプラグインを書いてみた( ^ω^)

AWS利用料金グラフ化Muninプラグインを書いてみた( ^ω^) はてなブックマーク - AWS利用料金グラフ化Muninプラグインを書いてみた( ^ω^)


◆ AWS Billing Alert いいですね。

今日は、先日の投稿の続きです。Amazon Web Services の利用料金見積もりの機能(AWS Billing Alert) が実装されました。導入手順や Management Console の操作については、こちらをご覧下さい。

AWS Billing Alerts を使った請求金額通知と、CLIを使った金額取得 | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2012/05/19/enable-aws-billing-alerts/

$248…やっちまったぜ…今月はBlu-ray買えません

これが出来ると何が嬉しいかというと、どのサービスに対して、どの程度のお金をかけているのかが、逐次確認出来る点です。EC2にいくら、RDSにいくら払ったかが分かるのは便利。Billing Alert があれば、x4.large インスタンスを立ち上げっぱなしで、悲劇を見ることはありません。(先月やらかしました。今は反省している)。

 

しかも、Billing Alert は、CloudWatch 経由で金額データを確認・通知ができます。CloudWatch が使えるということは…

ピコーン! CloudWatch Command Line Tool(CLI) を使ってデータが取得できる!

つまり、データが取得できれば Munin でグラフ化したら楽じゃね?

という事で Munin プラグインを書いてみました(イマココ)。

画面イメージは、こんな感じ。リアルタイムなのはこちら

Munin を使うのは他の理由もあります。理由は3つ。一つは、自分にとって普段使い慣れている監視システムである事。もう1つ、Munin 経由で通知を出せること。そして、CloudWatch のデータ保存期間は2週間だということ。過去の傾向を知るためには、データを残しておく事は必要でしょう。

◆ EstimateCharge プラグイン

書いたプラグインは二種類です。合計費用だけをグラフ化する aws_EstimatedCharges と、サービス毎にグラフ化する aws_EstimatedServices です。前者は単純に請求費用を知るため。後者は、内訳を確認するためです。

動作条件としては、Munin が必要です。あとは、CloudWatch CLI が動作する Java 1.5 以上の環境(CloudWatch CLI の導入については、先日の投稿をご覧下さい)。

ファイルは GitHub で公開しています。

zembutsu/AWS-EstimateCharge
https://github.com/zembutsu/AWS-EstimateCharge

動作はシンプルです。まずはデータを取得するスクリプトを設置します。cron で定期的に CloudWatch CLI を走らせ、金額データをファイルに保管するものです。あとは、Munin プラグインが、補完したデータを参照するという仕組み。

データ取得スクリプトを分けているのは、単純にタイムアウト対策です。また、環境によってデータ取得のタイミング(cron の実行間隔)は異なると思うので。

以下、実際にaws_EstimatedServices を有効にする場合の手順です。

まず aws_EstimatedServices.sh を適当なパスにおいて、chmod +x などで実行属性をつけておきます。設置時のパスや環境変数は、環境に応じて書き換えてください。このままでは動きません。。

#!/bin/sh

DAT=/var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat

export AWS_CLOUDWATCH_HOME=/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1
export PATH=$PATH:/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/bin
export EC2_REGION=us-east-1
export JAVA_HOME=/usr/local/jdk1.6/
export AWS_CREDENTIAL_FILE=/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/credential

start=`date --iso-8601=seconds --date '6 hour ago 1 minutes ago'`
end=`date --iso-8601=seconds --date '1 minutes ago'`

echo -n > $DAT

for METRICS in AmazonEC2 AmazonRDS AmazonS3 AmazonRoute53 AmazonSimpleDB AmazonSNS AWSDataTransfer ; do
echo -n "${METRICS}.value " >> $DAT
/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/bin/mon-get-stats \
EstimatedCharges \
--statistics "Maximum" \
--namespace "AWS/Billing" \
--dimensions "ServiceName=${METRICS},Currency=USD" \
--start-time $start --end-time $end | tail -1 | cut -f4 -d' ' >> $DAT
done

“DAT” がデータ出力先のファイルです。

# mkdir /var/lib/munin/plugin-aws-cloudwatch
# touch /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat
# chown -R zem:munin /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat
# chmod 755 /etc/munin/plugins/aws_EstimatedCharges

このように、ディレクトリやファイルの作成、パーミッションの設定をしておきます。

@j3tm0t0 さんからのヒント

※途中、CLI が反応なくて困っていたとき、忍者な @j3tm0t0 さんからヒントを戴きました。ありがとうございました! mon-get-stats を使うとき、–start-time と –end-time を指定しないと、正しく出ないことがあるようです。変数 $start と $end で、妙な時間の指定をしているのは、そのため。6時間分を指定しています。

あとは、スクリプトを /usr/local/bin/ に置く場合は

$ chmod 755 /usr/local/bin/aws_EstimatedServices.sh

パーミッションを指定します。それから、コマンドを実行してエラーが出なければ大丈夫です。

$ /usr/local/bin/aws_EstimatedServices.sh

ファイルも出力されているかどうか、あわせて確認します。

# cat /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat
AmazonEC2.value 14.37
AmazonRDS.value 0.0
AmazonS3.value 0.03
AmazonRoute53.value 0.51
AmazonSimpleDB.value 0.0
AmazonSNS.value 0.0
AWSDataTransfer.value 0.02

次に cron の設定です。

$ crontab -e

*/15 * * * *    /usr/local/bin/aws_EstimatedServices.sh

このような感じで、エントリを追加しておきます。

その次は Munin プラグイン aws_EstimatedCharges の設置です。

# touch /etc/munin/plugins/aws_EstimatedCharges
# chmod 755 /etc/munin/plugins/aws_EstimatedCharges
# chown munin:munin /etc/munin/plugins/aws_EstimatedCharges

ファイルを作成後は、中身を流し込みます。

#!/bin/sh

# Plugin to monitor the AWS CloudWatch metrics "EstimatedCharges" by services
# MIT License
# Mar 20, 2012
# version 0.0.1 Masahito Zembutsu (@zembutsu)

if [ "$1" = "autoconf" ]; then
echo yes
exit 0
fi

if [ "$1" = "config" ]; then
echo 'graph_title AWS EstimatedCharges by services'
echo 'graph_args --base 1000 -l 0'
echo "graph_category AWS";
echo 'graph_vlabel USD'
echo 'graph_scale no'
echo 'graph_info EstimatedCharges by services'

FIRST=1;
for METRICS in AmazonEC2 AmazonRDS AmazonS3 AmazonRoute53 AmazonSimpleDB AmazonSNS AWSDataTransfer; do
echo "${METRICS}.label ${METRICS}"
echo "${METRICS}.info EstimatedCharges service ${METRICS}"
echo "${METRICS}.type GAUGE"
if [ $FIRST -eq 1 ] ; then
echo "${METRICS}.draw AREA"
export FIRST=0;
else
echo "${METRICS}.draw STACK"
fi
done

exit 0
fi

for METRICS in AmazonEC2 AmazonRDS AmazonS3 AmazonRoute53 AmazonSimpleDB AmazonSNS AWSDataTransfer; do
echo -n "${METRICS}.value "
grep ${METRICS} /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat | cut -f2 -d' '
done

動作テストは、実際にプラグインを実行します。

# /etc/munin/plugins/aws_EstimatedServices
AmazonEC2.value 14.37
AmazonRDS.value 0.0
AmazonS3.value 0.03
AmazonRoute53.value 0.51
AmazonSimpleDB.value 0.0
AmazonSNS.value 0.0
AWSDataTransfer.value 0.02

このようにデータが表示されれば大丈夫です。

あとは、munin-node の再起動を行います。

# /etc/rc.d/init.d/munin-node restart
Stopping Munin Node agents:                                [  OK  ]
Starting Munin Node:                                       [  OK  ]

再起動後は munin-node を telnet で叩いて、直接データを fetch してみます。正常であれば、次のような結果がかえります。

$ telnet localhost 4949
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
Escape character is '^]'.
# munin node at sv.pocketstudio.jp
fetch aws_EstimatedServices
AmazonEC2.value 14.37
AmazonRDS.value 0.0
AmazonS3.value 0.03
AmazonRoute53.value 0.51
AmazonSimpleDB.value 0.0
AmazonSNS.value 0.0
AWSDataTransfer.value 0.02
.

あとは、Munin グラフの更新のタイミングで、データが反映されます。

個人的には「やっぱり Muniin は最高だぜ!! Munin( ^ω^)」…なので Munin を使いましたが、他の統合監視システム等々でも、同じような仕組みが出来ると思います。

それでは皆さん、素敵な AWS ライフを。

◆ 参照:

【AWS発表】 AWSクラウドの利用料金を監視・通知できるように – Amazon Web Services ブログ
http://aws.typepad.com/aws_japan/2012/05/monitor-estimated-charges-using-billing-alerts.html

Amazon CloudWatch Command Line Tool : Developer Tools : Amazon Web Services
http://aws.amazon.com/developertools/2534

AWS Billing Alerts を使った請求金額通知と、CLIを使った金額取得 | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2012/05/19/enable-aws-billing-alerts/

zembutsu/AWS-EstimateCharge
https://github.com/zembutsu/AWS-EstimateCharge

ファイルも出力されているかどうか、あわせて確認します。

9 thoughts on “AWS利用料金グラフ化Muninプラグインを書いてみた( ^ω^)

  1. u1

    munin2.0で本プラグインを試してみました。

    その際、munin-cronの実行周期と本プラグインのaws_EstimatedCharges.sh /aws_EstimatedServices.sh の実行周期が重なってるとecho -n “EstimatedCharges.value ” > $DATをしたタイミングでmunin-nodeで情報取得が走ってしまい、以下のエラーが出てしまいます。(hoge.valueという値だけかかれた状態でパーサが走ってしまう・・・)


    2012/06/17 21:10:02 [WARNING] 1 lines had errors while 1 lines were correct in data from 'fetch aws_EstimatedServices' on huge

    ひとまず、ワークアラウンドとしてEstimatedCharges.dat.tempに書き込んだ後にcpして更新する形に回避は出来ました。


    #!/bin/sh

    DAT1=/var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges.dat.temp
    DAT2=/var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges.dat
    export AWS_CLOUDWATCH_HOME=/srv/aws/CloudWatchexport PATH=$PATH:/srv/aws/CloudWatch/binexport EC2_REGION=us-east-1
    export JAVA_HOME=/usr/lib/jvm/java-6-openjdkexport AWS_CREDENTIAL_FILE=/srv/aws/CloudWatch/credentialstart=`date --iso-8601=seconds --date '6 hour ago 1 minutes ago'`end=`date --iso-8601=seconds --date '1 minutes ago'`echo -n "EstimatedCharges.value " > $DAT1/srv/aws/CloudWatch/bin/mon-get-stats \
    EstimatedCharges \
    --statistics "Maximum" \ --namespace "AWS/Billing" \ --dimensions "Currency=USD" \ --start-time $start --end-time $end | tail -1 | cut -f4 -d' ' >> $DAT1
    cp $DAT1 $DAT2

    一応、報告まで。

    1. 前佛 雅人 Post author

      u1 さん、コメントに気がつくのが遅くなってしまいました。
      同時に走ると問題出ますね、回避策もありがとうございます!

  2. ヒライ

    私のAWSアカウントだけかもしれませんがshでDATに書きだされるのが
    AmazonEC2.value AmazonRDS.value AmazonS3.value 3.18
    AmazonRoute53.value 0.93
    AmazonSimpleDB.value AmazonSNS.value 0.0
    AWSDataTransfer.value 4.58
    のように0.0が返ってくれないものがあって、その場合上記のように改行が入らなかったので
    plugins/aws_EstimatedServicesの結果もおかしくなっていました。
    なのでshを少し直しました
    全行改行を追加するという初歩的なやり方ですがmunin/plugins/aws_EstimatedServicesの結果は問題なくなりました。

    1. 前佛 雅人 Post author

      なるほど、、そうですね、例外時にちゃんと整形されるよう、調整したほうが良さそうですね。フィードバックありがとうございました。

  3. マックル

    初めまして。
    munin 2.0でこちらのプラグイン使わせていただいております。

    当方が言うのもおこがましいとは思うのですが・・・
    「動作テストは、実際にプラグインを実行します。」の下にある
    # /etc/munin/plugins/aws_EstimatedServices
    は、その前のchmodなどの時のようにaws_EstimatedChargesにしておくと
    このままコピペして動かしたときに焦らなくてすむと思いますので
    ぜひ変更お願いします。

    当方、少々悩んでしまいましたので(苦笑)
    おそらくここを見て設定されている他の方達は
    悩まれる事無くすぐに変更して事なき終える方が大半だとは思いますが
    よろしくお願いします。

    あと、ヒライさんのコメントにもある改行しない件ですが
    自分の場合では使っていないサービスの名前を削除してしのいでいますが
    使っていないサービスの値も取得出来れば嬉しいので
    なにかその後に進展がありましたら追記していただければ幸いです。

    1. 前佛 雅人 Post author

      マックルさん、はじめまして。
      フィードバック、ありがとうございます!

      そうですね、ご指摘の通り分かりづらいと思いますので、
      このあたりは修正しよと思います。

      改行の件は、環境の影響もあるのかなと思いつつ、実はまだ十分な確認に至っていません。こちらも併せて確認します。。

  4. Pingback: Muninを2.0にしてみた。 » murmur

  5. Pingback: サーバ監視ツール「munin」の使い方 ~ その4~ | さぶみっと!JAPAN

  6. Pingback: サーバ監視ツール「munin」の使い方 | 各路