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のグラフみとけというツッコミはいらないです。