Detailed Billing ReportのCSVを使って利用料金をグループ集計する
AWS利用料金に関する明細を知りたい
AWSでは月次利用レポートを出力できることは知られています。また、最近追加された機能で、1時間単位での利用料金を算出できることがわかりました。Programmatic AccessとDetailed Billing Reportを有効にすることで、翌月頭にS3へCSVファイルを出力してくれます。今回は、このデータを加工してアカウント毎に利用料金をグループ集計したいと思います。
Programmatic AccessとDetailed Billing Report
初期設定は無効になっていますので有効にしてください。
設定を有効にしたら、翌月頭に集計結果が出力されています。
2012年12月の利用明細をダウンロードしてCSVを解析したいと思います。
シェルコマンドでCSVを加工する
ダウンロードしたCSVファイルは圧縮済みで4.4MBありましたが、解凍すると145MBもありました。ためにし表計算ソフトに貼付けましたがフリーズしそうになるほど動作が重くなってしまい諦めました。そこで、シェルコマンドの組合せで解析したいと思います。
以下は生データの構造です。
$ head XXXXXXXXXXXX-aws-billing-detailed-line-items-2012-12.csv InvoiceID,PayerAccountId,LinkedAccountId,RecordType,ProductName,RateId,SubscriptionId,PricingPlanId,UsageType,Operation,AvailabilityZone,ReservedInstance,ItemDescription,UsageStartDate,UsageEndDate,UsageQuantity,BlendedRate,BlendedCost,UnBlendedRate,UnBlendedCost "Estimated","XXXXXXXXXXXX","0291XXXX6543","LineItem","Amazon Simple Notification Service","796908","16066900","187570","APN1-Requests-Tier1","ListSubscriptions","","N","First 100,000 Amazon SNS API Requests per month are free","2012-12-05 02:00:00","2012-12-05 03:00:00","2.00000000","0.0000000000","0.00000000","0.0000000000","0.00000000" "Estimated","XXXXXXXXXXXX","0291XXXX6543","LineItem","Amazon Simple Notification Service","796908","16066900","187570","APN1-Requests-Tier1","ListSubscriptions","","N","First 100,000 Amazon SNS API Requests per month are free","2012-12-07 07:00:00","2012-12-07 08:00:00","3.00000000","0.0000000000","0.00000000","0.0000000000","0.00000000" "Estimated","XXXXXXXXXXXX","0291XXXX6543","LineItem","Amazon Simple Notification Service","796908","16066900","187570","APN1-Requests-Tier1","ListTopics","","N","First 100,000 Amazon SNS API Requests per month are free","2012-12-05 02:00:00","2012-12-05 03:00:00","2.00000000","0.0000000000","0.00000000","0.0000000000","0.00000000"
アカウント毎の利用料金一覧を取得してみましょう。
$ cat -e XXXXXXXXXXXX-aws-billing-detailed-line-items-2012-12.csv \ | grep AccountTotal ,"XXXXXXXXXXXX","AAAAAAAAAAAA","AccountTotal",,,,,,,,,"Total for linked account# DDDDDDDDDDDD",,,,,"62.0958694994",,"62.0954897394"$ ,"XXXXXXXXXXXX","GGGGGGGGGGGG","AccountTotal",,,,,,,,,"Total for linked account# GGGGGGGGGGGG",,,,,"232.3303374553",,"240.7962573653"$ ,"XXXXXXXXXXXX","BBBBBBBBBBBB","AccountTotal",,,,,,,,,"Total for linked account# BBBBBBBBBBBB",,,,,"390.8678097517",,"404.5384995117"$ ,"XXXXXXXXXXXX","CCCCCCCCCCCC","AccountTotal",,,,,,,,,"Total for linked account# DDDDDDDDDDDD",,,,,"62.0958694994",,"62.0954897394"$ ,"XXXXXXXXXXXX","GGGGGGGGGGGG","AccountTotal",,,,,,,,,"Total for linked account# CCCCCCCCCCCC",,,,,"648.2104656305",,"648.2111198705"$ ,"XXXXXXXXXXXX","DDDDDDDDDDDD","AccountTotal",,,,,,,,,"Total for linked account# GGGGGGGGGGGG",,,,,"232.3303374553",,"240.7962573653"$ ,"XXXXXXXXXXXX","HHHHHHHHHHHH","AccountTotal",,,,,,,,,"Total for linked account# HHHHHHHHHHHH",,,,,"18.5825540326",,"18.5826942326"$ ...
アカウント毎の合計利用金額が出ました。不要な情報があるので成型しましょう。
$ cat -e XXXXXXXXXXXX-aws-billing-detailed-line-items-2012-12.csv \ | grep AccountTotal \ | cut -d, -f3,20 \ | sed -e 's/\"//g' AAAAAAAAAAAA,0.00000000$ EEEEEEEEEEEE,119.0395882533$ FFFFFFFFFFFF,703.3980909915$ BBBBBBBBBBBB,406.9690631694$ HHHHHHHHHHHH,703.3980909915$ CCCCCCCCCCCC,0.00000000$ DDDDDDDDDDDD,0.00000000$ GGGGGGGGGGGG,364.0965128994$ ...
イイ感じで合計が出ましたね。次は、複数レコードに分散されたデータをアカウント毎にグループ化して集計したいと思います。
$ cat -e XXXXXXXXXXXX-aws-billing-detailed-line-items-2012-12.csv \ | grep HogeHoge \ | cut -d, -f3,20 \ | sed -e 's/\"//g' > temp.csv $ cat temp.csv AAAAAAAAAAAA,120.000516$ BBBBBBBBBBBB,320.165200$ AAAAAAAAAAAA,300.001965$ BBBBBBBBBBBB,345.033787$ BBBBBBBBBBBB,100.058508$ CCCCCCCCCCCC,230.087208$
1カラム目のアカウントIDでグループ化して2カラム目の小計を出したいと思います。
$ awk 'BEGIN { FS=","; } { account[$1] += $2; } END { for (i in account) print i" , " account[i]; }' temp.csv | sort > result.csv $ cat result.csv AAAAAAAAAAAA,520.000516$ BBBBBBBBBBBB,420.165200$ CCCCCCCCCCCC,630.087208$
アカウント毎にグループ化して表示させることができました!
まとめ
Programmatic AccessとDetailed Billing Reportを有効にすることによって、今まで取得できなかったUnBlendedModeの利用料金を取得できるようになりました。しかし、そのままではデータの加工が必要なのですが、シェルプログラミングすることで、簡単にかつ高速に目的のデータを取得できました。この作業は毎月発生しますので、理想系としては、AWS Data Pipelineに実行させてS3にアップロードするとか、メール通知できると更に使い勝手が良くなるかと思いました。請求周りを閲覧するのは経理担当者ですので、AWSを意識すること無く使えて、金額の確認ができるようにしたいですね。