Detailed Billing ReportのCSVを使って利用料金をグループ集計する

AWS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS利用料金に関する明細を知りたい

AWSでは月次利用レポートを出力できることは知られています。また、最近追加された機能で、1時間単位での利用料金を算出できることがわかりました。Programmatic AccessとDetailed Billing Reportを有効にすることで、翌月頭にS3へCSVファイルを出力してくれます。今回は、このデータを加工してアカウント毎に利用料金をグループ集計したいと思います。

Programmatic AccessとDetailed Billing Report

初期設定は無効になっていますので有効にしてください。

detailed-billing-exe-001

設定を有効にしたら、翌月頭に集計結果が出力されています。

detailed-billing-exe-000

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を意識すること無く使えて、金額の確認ができるようにしたいですね。

参考情報

Detailed Reports as Comma-Separated Values (CSV) Files