AWS利用料のレポートツール「Cost Reporter」でちょっと便利にAWS料金を取得してみる

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

まいど、大阪の市田です。
AWSの料金確認といえば「Cost Explorer」が便利です。APIも提供されていて「AWS CLI」でも利用することが可能ですが、今回は簡単にCSVやJSON形式として出力できる「Cost Reporter」というツールをご紹介する小ネタでございます。

GitHub - FittedCloud/costreporter: Cost analysis from using CostExplorer from the command line.

尚、AWS CLIの場合は下記のエントリでご紹介しています。

Cost ExplorerのAPIの提供が開始されました

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出力できたりサマリー情報を出力できるのは他のプログラムへ組み込むのが便利なように感じました。
必要に応じて使って頂ければと思います。

以上です。