AWS Cost Explorer のCLIをたたいてみた。

こんにちは。ガジュマル育ててる人です。

前回の記事でCostExplorerを使ってみたのですが、Organizationsでメンバーアカウント毎にどれだけ割引がかかっているかうまく出すことができなかったので(請求書には記載はあります)
今回はCostExplorer のCLIを使って出せるかやってみます。

ステップ1:CostExplorerCLIを実行してみる

詳しくは公式のリファレンスを参照ください。

取り急ぎ公式ページをみていると
get-cost-and-usageで出せるみたいです。

早速AWSのコンソールからCloudShellを立ち上げて、とりあえずhelpを実行してみます。



[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws ce get-cost-and-usage help

GET-COST-AND-USAGE()                                      GET-COST-AND-USAGE()



NAME
       get-cost-and-usage -

DESCRIPTION
       Retrieves  cost  and  usage  metrics  for your account. You can specify
       which cost and usage-related  metric  that  you  want  the  request  to
       return.  For  example,  you can specify BlendedCosts or UsageQuantity .
       You can also filter and group your data by various dimensions, such  as
       SERVICE  or AZ , in a specific time range. For a complete list of valid
       dimensions, see the GetDimensionValues operation. Management account in
       an organization in Organizations have access to all member accounts.

       For  information  about filter limitations, see Quotas and restrictions
       in the Billing and Cost Management User Guide .

       See also: AWS API Documentation

SYNOPSIS
            get-cost-and-usage
          --time-period <value>
          --granularity <value>
          [--filter <value>]
          --metrics <value>
          [--group-by <value>]
          [--next-page-token <value>]
          [--cli-input-json | --cli-input-yaml]
          [--generate-cli-skeleton <value>]
          [--debug]
          [--endpoint-url <value>]
          [--no-verify-ssl]
          [--no-paginate]
          [--output <value>]
          [--query <value>]
          [--profile <value>]
          [--region <value>]
          [--version <value>]
          [--color <value>]
          [--no-sign-request]
          [--ca-bundle <value>]
          [--cli-read-timeout <value>]
          [--cli-connect-timeout <value>]
          [--cli-binary-format <value>]
          [--no-cli-pager]
          [--cli-auto-prompt]
          [--no-cli-auto-prompt]

(以下略)

実行には少なくとも3つの値の指定がいるようです。

--time-period:期間指定
例えば、2023年
6月1日から2023年7月1日とすることで2023年6月分を出すことができます。
Start=2023-06-01,End=2023-07-01 

--granularity :下記の3つから選択
・DAILY
・MONTHLY
・HOURLY
今回は1か月分出したいので、MONTHLYにしてみます。

--metrics  :下記の7つから選択
・AmortizedCost
・BlendedCost
・NetAmortizedCost
・NetUnblendedCost
・NormalizedUsageAmount
・UnblendedCost
・UsageQuantity
メトリクスは少し細かいので、割愛しますが、今回はUnblendedCostを選択します。

この3つを選択して再度実行してみます。

[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws ce get-cost-and-usage \
--time-period Start=2023-06-01,End=2023-07-01 \
--granularity MONTHLY \
--metrics UnblendedCost

{
    "ResultsByTime": [
        {
            "TimePeriod": {
                "Start": "2023-06-01",
                "End": "2023-07-01"
            },
            "Total": {
                "UnblendedCost": {
                    "Amount": "4742.4577453379",
                    "Unit": "USD"
                }
            },
            "Groups": [],
            "Estimated": false
        }
    ],
    "DimensionValueAttributes": []
}

こんな感じでOrganizations全体の金額を出すことができました。

ステップ2:アカウント毎に出してみる

それでは、次にアカウント毎に出したいと思います。
アカウント毎の値を出すのはどうやらDimensionsでLINKED_ACCOUNTを選択すれば良さそうなので、group-byのオプションを使って指定してみます。 

[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws ce get-cost-and-usage \
> --time-period Start=2023-06-01,End=2023-07-01 \
> --granularity MONTHLY \
> --metrics UnblendedCost \
> --group-by Type=DIMENSION,Key=LINKED_ACCOUNT

{
    "GroupDefinitions": [
        {
            "Type": "DIMENSION",
            "Key": "LINKED_ACCOUNT"
        }
    ],
    "ResultsByTime": [
        {
            "TimePeriod": {
                "Start": "2023-06-01",
                "End": "2023-07-01"
            },
            "Total": {},
            "Groups": [
                {
                    "Keys": [
                        "[アカウントID]"
                    ],
                    "Metrics": {
                        "UnblendedCost": {
                            "Amount": "8.3147959602",
                            "Unit": "USD"
                        }
                    }
                },
(長すぎるので中略)
       {

            "Value": "[アカウントID]",
            "Attributes": {
                "description": "[アカウント名]"
            }
        },
        {
            "Value": "[アカウントID]",
            "Attributes": {
                "description": "[アカウント名]"
            }
        }
    ]
}

だいぶ見づらいですが、アカウントIDごとのコストを出すことができました。

ステップ3:割引額ごとに出してみる

さらに割引額ごとに出してみようと思います。
前回の記事でディメンションが日本語で料金タイプを指定すれば良さそうなので、似たものを探してみると、RECORD_TYPEを指定するとよさそうです。

さらに--group-byは2つまで指定ができるようなので、これに2つ目の条件を加えていきます。

[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws ce get-cost-and-usage \
> --time-period Start=2023-06-01,End=2023-07-01 \
> --granularity MONTHLY \
> --metrics UnblendedCost \
> --group-by Type=DIMENSION,Key=LINKED_ACCOUNT Type=DIMENSION,Key=RECORD_TYPE

{
    "GroupDefinitions": [
        {
            "Type": "DIMENSION",
            "Key": "LINKED_ACCOUNT"
        },
        {
            "Type": "DIMENSION",
            "Key": "RECORD_TYPE"
        }
    ],
    "ResultsByTime": [
        {
            "TimePeriod": {
                "Start": "2023-06-01",
                "End": "2023-07-01"
            },
            "Total": {},
            "Groups": [
                {
                    "Keys": [
                        "[アカウントID]",
                        "Solution Provider Program Discount"
                    ],
                    "Metrics": {
                        "UnblendedCost": {
                            "Amount": "-0.2336534822",
                            "Unit": "USD"
                        }
                    }
                },
                {
                    "Keys": [
                        "[アカウントID]",
                        "Tax"
                    ],
                    "Metrics": {
                        "UnblendedCost": {
                            "Amount": "0.76",
                            "Unit": "USD"
                        }
                    }
                },
                {
                    "Keys": [
                        "[アカウントID]",
                        "Usage"
                    ],
                    "Metrics": {
                        "UnblendedCost": {
                            "Amount": "7.7884494424",
                            "Unit": "USD"
                        }
                    }
(長すぎるので以下省略)

すごくわかりにくいですが、メンバーアカウント毎にSolution Provider Program Discountなどの項目で出ていることが確認できました。

このままだと少し見づらいので、queryとoutputのオプションを使ってわかりやすく表示します。

queryでは必要な結果が表示されているResultsByTimeから
アカウントIDと内容(TaxなのかUsageなのかSolution Provider Program Discountなのか)とUnblendedCostのAmountで出ている金額を抜き出します。
outputは個人の好みですが、tableで表示させてみます。

[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws ce get-cost-and-usage \
> --time-period Start=2023-06-01,End=2023-07-01 \
> --granularity MONTHLY \
> --metrics UnblendedCost \
> --group-by Type=DIMENSION,Key=LINKED_ACCOUNT Type=DIMENSION,Key=RECORD_TYPE \
> --query "ResultsByTime[].Groups[].[Keys[0],Keys[1],Metrics.UnblendedCost.Amount]" \
> --output table

-----------------------------------------------------------------------------------------------
|                                                   GetCostAndUsage                       |
+-------------------+-------------------------------------------------+----------------------+
|  [アカウントID]|  Solution Provider Program Discount  |  -0.2336534822    |
|  [アカウントID]|  Tax                                                                 |  0.76                        |
|  [アカウントID]|  Usage                                                            |  7.7884494424      |
|  [アカウントID]|  Solution Provider Program Discount  |  -0.5089967566    |
|  [アカウントID]|  Tax                                                                 |  1.65                        |
|  [アカウントID]|  Usage                                                            |  16.966558508      |
|  [アカウントID]|  SavingsPlanCoveredUsage                    |  0.7836631668      |
|  [アカウントID]|  SavingsPlanNegation                               |  -0.7836631668    |
|  [アカウントID]|  Solution Provider Program Discount  |  -30.9015772885   |
|  [アカウントID]| Tax                                                                  |  99.94                       |
|  [アカウントID]|  Usage                                                            |  1055.0545787916 |
|  [アカウントID]|  Solution Provider Program Discount  |  -0.0005286687      |
|  [アカウントID]|  Tax                                                                  |  0                   |
|  [アカウントID]|  Usage                                     |  0.0176207249      |
|  [アカウントID]|  Solution Provider Program Discount   |  -0.0067101135     |
|  [アカウントID]|  Tax                                                                  |  0.02                         |
|  [アカウントID]|  Usage                                                             |  0.2236704521       |
(以下略)


きちんとメンバーアカウント毎に出ているので、このまま使うこともできますし
outputをtextにしていろいろ加工もできそうです。

最後に

コンソールからだとディメンションが1つしか設定できなかったので、アカウント毎に割引額は分からなかったのですが、CLIだと2つ指定できるので、無事やりたいことができました。

今回使わなかったfilterオプションなども実務で使うなら役立つとおもうので、しっかり勉強していこうと思います。

今回はこのあたりで!それではまた!