雑多なインフラエンジニア日記

技術ブログでっす~

mon-get-statsで請求額を取得

CloudWatchのAPIを使えば、AWSからの請求額を取得出来ますYOという話。

全体の請求額だけではなく、EC2、RDSなど各サービス毎の請求額も取得
可能です。

初期セットアップ


・Billing alarm を設定

この設定をしてからAWS側で請求額モニタリング開始&設定金額を超えると、
メールでお知らせしてくれます。

http://thinking.ne.jp/2013/01/aws-cloudwatch-price/


あと、請求額グラフを見たい&アラーム設定を変更したい場合は、N.Virginia
(us-east-1)を選択して下さい。
個別のリージョンの請求額という概念ではなく、全リージョンの請求額をN.Virginia
が一括管理しているといった概念みたいです。

http://aws.amazon.com/jp/billing/faqs/#Can_I_view_estimated_charge_metrics_or_set_billing_alerts_in_a_region_other_than_US-East



・CloudWatch APIをインストール (AmazonLinuxなら初期でインストール済みかも)

http://aws.amazon.com/developertools/2534


環境変数を設定 (過去記事を参照)

http://xoxo-infra.hatenablog.com/entry/2013/02/08/013002


・リージョンは us-east-1 しか対応していないので、EC2_REGIONのみ
上書きで設定。

export EC2_REGION=us-east-1


請求額を取得


・mon-get 実行

$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '6 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
2013-04-03 14:31:00  88.01  None


この例の場合、全体の請求額は、$88.01 です。

--start-time、--end-time が解り辛いと思いますので、ちょろっと解説しますと、
6時間前から直近1分前までの請求額のMAXを取得しています。
時間の幅が6時間なのは、CloudWatch側の請求額の更新が6時間置き(恐らく)だから
です。
# CloudWatch alarmのグラフが6時間置きにしか更新されていない。

--dimensions "ServiceName=AmazonEC2,Currency=USD" にすれば、EC2のみの請求額を取得できます。

・deimensionsに指定できる値は以下で確認できます。

$ mon-list-metrics | grep EstimatedCharges | awk '{print $1,$3}'
EstimatedCharges {ServiceName=AmazonEC2,Currency=USD}
EstimatedCharges {ServiceName=AmazonRoute53,Currency=USD}
EstimatedCharges {ServiceName=AmazonRDS,Currency=USD}
EstimatedCharges {ServiceName=AWSDataTransfer,Currency=USD}
EstimatedCharges {ServiceName=AmazonSNS,Currency=USD}
EstimatedCharges {ServiceName=AmazonS3,Currency=USD}
EstimatedCharges {Currency=USD}


・start-time を変えて実験

・4時間前は取得できる。
$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '4 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
2013-04-03 14:31:00  222.04  None
$

・3時間前は取得できない。(何も表示されない)
$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '3 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
$

・12時間以上前を指定してみる。
$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '12 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
2013-04-03 06:39:00  20.2   None
2013-04-03 10:31:00  88.01  None
2013-04-03 14:31:00  88.01  None
$
$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '16 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
2013-04-03 06:39:00  20.2   None
2013-04-03 10:31:00  88.01  None
2013-04-03 14:31:00  88.01  None
$
$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '20 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
2013-04-03 06:39:00  20.2   None
2013-04-03 10:31:00  88.01  None
2013-04-03 14:31:00  88.01  None
$
$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '24 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
2013-04-03 06:39:00  20.2   None
2013-04-03 10:31:00  88.01  None
2013-04-03 14:31:00  88.01  None
$ 
$ mon-get-stats EstimatedCharges --statistics "Maximum" \
--namespace "AWS/Billing" --dimensions "Currency=USD" \
--start-time `date --iso-8601=seconds --date '28 hour ago 1 minutes ago'` \
--end-time `date --iso-8601=seconds --date '1 minutes ago'`
mon-get-stats:  Malformed input-You have requested up to 1,680 datapoints, which exceeds the
 limit of 1,440. You may reduce the datapoints requested by increasing Period,
 or decreasing the time range.
Usage:
mon-get-stats
        MetricName  --namespace  value  --statistics  value[,value...]
       [--dimensions  "key1=value1,key2=value2..." ] [--end-time  value ]
       [--period  value ] [--start-time  value ] [--unit  value ]
        [General Options]
For more information and a full list of options, run "mon-get-stats --help"
$ 


date --iso-8601=seconds --date '28 hour ago 1 minutes ago' (28h前)にしたら、
エラーになりました。
うーん、ある程度の時間幅が決まってそうな感じ!?

というか、CloudWatch alarmのグラフが6時間置きにしか更新されていないのに、
4時間置きに請求額が取得できています。(謎)

仕様がいまいち解りませんw


・2013/04/04追記
munin と連携させて、請求額をグラフ化しているのですが、4時間置きにグラフが
あがっているので、APIが返す値は4時間で更新されている説が濃厚です。

・muninグラフ (4-6時間置きに増えている。この更新間隔のブレは謎です)



・CloudWatch の Billingのグラフを見る限り、4時間毎に更新されているようです。00:30、04:30とxx:30毎に更新されてます。
muninのグラフが4,6hづつ増加しているのは、cron設定が悪いのか。
1時間置きに実行しているんだけどなぁ。


f:id:jinjin252525:20130404163631p:plain