0

AWSの課金状況をプログラマブルに取得する

AWSの課金状況をプログラマブルに取得するには、CloudWatch経由で取得します。
Billing用のAPIがあるわけでなく、CloudWatchでAWSの下記情報を監視するように設定し、そこから課金のメトリクスを取得します。

「課金」と書いたものの正確には「請求額」の取得ですね。
取得にあたり2つ注意点として、

  • Amazon側の請求確定のサイクルは必ずしも1時間に1回というわけではないので、ずっとEC2を使ってるのにAPIでデータを取得してみても1時間前と2時間前の料金が同じという事は多々あります。大体3時間くらいのサイクルでアップデートされてる気がします。
  • サービス別では取得できるけど、リージョン別やインスタンス別の取得等はできません。

という事があります。

以下がスクリプトです。
Pythonなんでbotoを利用しています。
どこのブログに書いてたけど確かにec2のネームスペースというのが気持ち悪い。
元々、CloudWatchはEC2の負荷状況を監視する目的だけだったからかな。

import datetime
import os
import sys
import boto.ec2.cloudwatch

AWS_REGION = "us-east-1"
AWS_KEY_ID = "***************"
AWS_SECRET_KEY = "***************"
 
cloudwatch_conn = boto.ec2.cloudwatch.connect_to_region(
        AWS_REGION,
        aws_access_key_id=AWS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_KEY)

end = datetime.datetime.utcnow()
start = end - datetime.timedelta(hours=4)
 
services = ['AWSDataTransfer', 'AmazonEC2', 'AmazonGlacier','AmazonRoute53',  'AmazonS3', 'AmazonSNS']
 
for service in services:
        value = cloudwatch_conn.get_metric_statistics(
                3600,
                start,
                end,
                'EstimatedCharges',
                'AWS/Billing',
                'Maximum',
                dimensions = {'ServiceName':[service], 'Currency':['USD']}
        )
        if not value:
                continue
        print service
        print value
        print value[0]['Maximum']

課金状況を取得するには、
metric_nameにEstimatedChargesをnamespaceにAWS/Billingにしてやる必要があります。
BillingServicesは使ってるサービスを列挙すれば良いです。

US-EASTにすべてのリージョンの課金情報があつまるので、それに接続します。

4時間前から取得していますが、これも前述通り1時間前とかだと請求額が確定してないからかデータの取得はできません。

色々おもしろいことができそうですね。
現在は、これをFluentdに投げて、Kibanaで読み込むということをしています。
CloudWatchのグラフみとけというツッコミはいらないです。

大阪のWEB屋です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です