AWS利用料のレポートツール「Cost Reporter」でちょっと便利にAWS料金を取得してみる
まいど、大阪の市田です。
AWSの料金確認といえば「Cost Explorer」が便利です。APIも提供されていて「AWS CLI」でも利用することが可能ですが、今回は簡単にCSVやJSON形式として出力できる「Cost Reporter」というツールをご紹介する小ネタでございます。
GitHub - FittedCloud/costreporter: Cost analysis from using CostExplorer from the command line.
尚、AWS CLIの場合は下記のエントリでご紹介しています。
2020年7月1日 Githubのリンク切れのため追記
元々このツールは「fittedcloud」にて提供されていたようですが、現在は下記の企業に買収されているようです。 そのため、執筆当時のGithubリポジトリも既に削除されていました。
Apptio, Inc. Acquires Machine Learning Cloud Optimization Company FittedCloud - Apptio
別のリポジトリで公開されているようですので、もし使われる場合は下記よりご利用いただければと思います。
(動作確認は行っていませんのでご了承ください)
GitHub - pborreli/costreporter: Cost analysis from using CostExplorer from the command line.
Cost Explorerのインストール
githubのページには「Python 2.7」が必要とのことなので適当な環境を用意します。今回は、Macのpyenv
で切り替えて利用することにしました。(boto3もインストールをお忘れなく)
後はgit clone
するだけです。
$ git clone https://github.com/FittedCloud/costreporter.git
IAMの準備
IAM Userでの利用が前提なツールですので、下記の権限を持ったユーザを作成しておきます。アクセスキーとシークレットキーも忘れず控えておくようにしましょう。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ce:GetReservationUtilization", "ce:GetDimensionValues", "ce:GetCostAndUsage", "ce:GetTags" ], "Resource": "*" } ] }
使い方
IAM Userの情報はアクセスキーとシークレットキーを指定するか、AWS CLIのprofile名を指定する形になります。
# アクセスキーとシークレットキーを指定する場合 $ python costreporter.py -a <aws access key> -s <aws secret key> -t <start-time as, YYYY-MM-DD>,<end-time as YYYY-MM-DD> # profile名を指定する場合 $ python costreporter.py -p <profile name> -t <start-time as, YYYY-MM-DD>,<end-time as YYYY-MM-DD>
デフォルト設定で出力
試しにオプション無しで実行してみます。期間の指定は-t
オプションです。下記の例では「2018年4月1日〜4月20日」で確認しています。
$ python costreporter.py -t 2018-04-01,2018-04-20 -a <access key> -s <secret key>
Summary of costs: 2018-04-01 - 2018-04-20 Group Cost ----- ---- AWS CloudTrail 0.01 USD AWS Config 3.05 USD AWS Directory Service 0.05 USD AWS IoT 0.00 USD AWS Key Management Service 0.63 USD Amazon CloudFront 0.08 USD Amazon DynamoDB 3.89 USD Amazon EC2 Container Registry (ECR) 0.01 USD Amazon Elastic Block Store 11.55 USD Amazon Elastic Compute Cloud - Compute 0.39 USD Amazon Elastic Load Balancing 3.53 USD Amazon GuardDuty 0.00 USD Amazon QuickSight 0.00 USD Amazon Route 53 0.97 USD Amazon Simple Notification Service 0.00 USD Amazon Simple Queue Service 0.00 USD Amazon Simple Storage Service 0.25 USD Amazon Transcribe 0.69 USD AmazonCloudWatch 1.26 USD Tax 2.00 USD
指定の期間中に利用した料金内訳をサービス毎に確認することができました。
CSVで出力
CSVで出力する場合は-c
または--csv
オプションを付けます。
$ python costreporter.py -t 2018-04-01,2018-04-20 -a <access key> -s <secret key> -c
estimated,time_start,region,time_end,unblended_cost_Amount,usage_quantity_Unit,blended_cost_Amount,group,usage_quantity_Amount,blended_cost_Unit,unblended_cost_Unit True,2018-04-01,us-east-1,2018-04-20,0.01154,N/A,0.01154,AWS CloudTrail,276433,USD,USD True,2018-04-01,us-east-1,2018-04-20,3.053,N/A,3.053,AWS Config,352,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.0495166667,N/A,0.0495166667,AWS Directory Service,0.6189583333,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.0000035,N/A,0.0000035,AWS IoT,2,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.6345393384,N/A,0.6345505116,AWS Key Management Service,413.6333333384,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.0800014698,N/A,0.0797480442,Amazon CloudFront,361.0001470038,USD,USD True,2018-04-01,us-east-1,2018-04-20,3.892532,N/A,3.120627336,Amazon DynamoDB,9120,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.0061501176,N/A,0.0061501176,Amazon EC2 Container Registry (ECR),0.0615011304,USD,USD True,2018-04-01,us-east-1,2018-04-20,11.5549863799,N/A,11.5549863799,Amazon Elastic Block Store,195.2986935238,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.3922888402,N/A,0.2017561936,Amazon Elastic Compute Cloud - Compute,90.2142229722,USD,USD True,2018-04-01,us-east-1,2018-04-20,3.5317530584,N/A,3.5317486832,Amazon Elastic Load Balancing,150.0102586101,USD,USD True,2018-04-01,us-east-1,2018-04-20,0,N/A,0,Amazon GuardDuty,155496.0021607593,USD,USD True,2018-04-01,us-east-1,2018-04-20,0,N/A,0,Amazon QuickSight,0.6236111161,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.9671520678,N/A,0.9847026359,Amazon Route 53,1679.2666666654,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.0002268099,N/A,0.0002266112,Amazon Simple Notification Service,453.0034073452,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.0000052143,N/A,0.0000052146,Amazon Simple Queue Service,13.0000001192,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.2483763878,N/A,0.2483164569,Amazon Simple Storage Service,215973.8358898359,USD,USD True,2018-04-01,us-east-1,2018-04-20,0.6925955192,N/A,0.6925955192,Amazon Transcribe,1731.488798,USD,USD True,2018-04-01,us-east-1,2018-04-20,1.2639812969,N/A,1.2639798149,AmazonCloudWatch,30.5641025137,USD,USD True,2018-04-01,us-east-1,2018-04-20,2,N/A,2,Tax,0,USD,USD
今度は、月次(マンスリー)で出力してみます。月次か日次の指定は-i
オプションです。下記の場合だと「1月1日から3月31日まで」を指定したので、1月、2月、3月の各月毎に出力されます。
$ python costreporter.py -i MONTHLY -t 2018-01-01,2018-03-31 -a <access key> -s <secret key> -c
estimated,time_start,region,time_end,unblended_cost_Amount,usage_quantity_Unit,blended_cost_Amount,group,usage_quantity_Amount,blended_cost_Unit,unblended_cost_Unit (最初は1月分が出力されています。) ・・・ False,2018-01-01,us-east-1,2018-02-01,0.04362,N/A,0.04362,AWS CloudTrail,381781,USD,USD False,2018-01-01,us-east-1,2018-02-01,5.219,N/A,5.219,AWS Config,1074,USD,USD ・・・ (中略) ・・・ (次に2月分が出力されています。) False,2018-02-01,us-east-1,2018-03-01,0.06398,N/A,0.06398,AWS CloudTrail,399269,USD,USD False,2018-02-01,us-east-1,2018-03-01,2,N/A,1.9275362318,AWS CodeCommit,2,USD,USD ・・・ (中略) ・・・ (最後に3月分が出力されています。) False,2018-03-01,us-east-1,2018-03-31,0.03808,N/A,0.03808,AWS CloudTrail,432301,USD,USD False,2018-03-01,us-east-1,2018-03-31,4.19,N/A,4.19,AWS Config,731,USD,USD ・・・ (以下略)
日次(デイリー)でも出力してみます。「1月1日から3月31日まで」の料金を1日単位で出力してみます。
$ python costreporter.py -i DAILY -t 2018-01-01,2018-03-31 -a <access key> -s <secret key> -c
estimated,time_start,region,time_end,unblended_cost_Amount,usage_quantity_Unit,blended_cost_Amount,group,usage_quantity_Amount,blended_cost_Unit,unblended_cost_Unit False,2018-01-01,us-east-1,2018-01-02,0.00032,N/A,0.00032,AWS CloudTrail,10378,USD,USD False,2018-01-01,us-east-1,2018-01-02,0.032258064,N/A,0.032258064,AWS Key Management Service,0.032258064,USD,USD (中略) False,2018-03-30,us-east-1,2018-03-31,0.0123849651,N/A,0.0124003496,Amazon Simple Storage Service,10711.087017965,USD,USD False,2018-03-30,us-east-1,2018-03-31,0.0639804119,N/A,0.0639804119,AmazonCloudWatch,0.5884292362,USD,USD
JSONで出力
JSONで出力する場合は-j
、--json
オプションを付けます。まずは月次表示です。
$ python costreporter.py -i MONTHLY -t 2018-01-01,2018-03-31 -a <access key> -s <secret key> -j
[ { "blended_cost": { "Amount": "0.04362", "Unit": "USD" }, "estimated": false, "group": [ "AWS CloudTrail" ], "region": "us-east-1", "time_end": "2018-02-01", "time_start": "2018-01-01", "unblended_cost": { "Amount": "0.04362", "Unit": "USD" }, "usage_quantity": { "Amount": "381781", "Unit": "N/A" } }, { "blended_cost": { "Amount": "5.219", "Unit": "USD" }, "estimated": false, "group": [ "AWS Config" ], "region": "us-east-1", "time_end": "2018-02-01", "time_start": "2018-01-01", "unblended_cost": { "Amount": "5.219", "Unit": "USD" }, (以下略)
日次(デイリー)で出力する場合は以下です。CSVの時と同様に1日単位で出力されます。
$ python costreporter.py -i DAILY -t 2018-01-01,2018-03-31 -a <access key> -s <secret key> -j
[ { "blended_cost": { "Amount": "0.00032", "Unit": "USD" }, "estimated": false, "group": [ "AWS CloudTrail" ], "region": "us-east-1", "time_end": "2018-01-02", "time_start": "2018-01-01", "unblended_cost": { "Amount": "0.00032", "Unit": "USD" }, "usage_quantity": { "Amount": "10378", "Unit": "N/A" } }, { "blended_cost": { "Amount": "0.032258064", "Unit": "USD" }, "estimated": false, "group": [ "AWS Key Management Service" ], "region": "us-east-1", "time_end": "2018-01-02", "time_start": "2018-01-01", "unblended_cost": { "Amount": "0.032258064", "Unit": "USD" }, "usage_quantity": { "Amount": "0.032258064", "Unit": "N/A" } }, (以下略)
その他の表示例
他にもインスタンスタイプ別に表示したりできます。-d
(--dimension
)オプションを使います。
例えば、「利用したEC2インスタンスの料金を指定期間でインスタンスタイプ別に表示」したい場合は、下記のようにINSTANCE_TYPE
を指定します。
$ python costreporter.py -i MONTHLY -t 2018-01-01,2018-04-20 -a <access key> -s <secret key> -d INSTANCE_TYPE
Summary of costs: 2018-01-01 - 2018-04-20 Group Cost ----- ---- NoInstanceType 450.13 USD db.r4.large 2.32 USD t2.micro 2.31 USD t2.nano 0.58 USD m4.large 0.00 USD m4.xlarge 3.07 USD t2.small 0.00 USD
RDSでdb.r4.large
を短時間だけ使っていた事が分かります。
一括請求(コンソリデーティッドビリング)を利用している場合は、アカウント毎に利用料金を出力できます。下記の例では連結アカウントが無いので1アカウントだけの出力になっています。
$ python costreporter.py -t 2018-04-01,2018-04-20 -a <access key> -s <secret key> -d LINKED_ACCOUNT
Summary of costs: 2018-04-01 - 2018-04-20 Group Cost ----- ---- <AWSアカウントID> 28.38 USD
最後に
AWS CLIの出力を加工すれば同じように出力できますが、簡単にCSV出力できたりサマリー情報を出力できるのは他のプログラムへ組み込むのが便利なように感じました。
必要に応じて使って頂ければと思います。
以上です。