LoginSignup
1
0

More than 1 year has passed since last update.

AWS Cost ExplorerのAPIとGUIで額が違う?と思って調べた記録

Posted at

目的

AWS Cost ExplorerのAPIを利用して月ごとの額を確認しようと思ったとき、
APIで出た額とGUI (コンソールのCost Explorer) の額がずれていたため、その原因を探りました。
結果、私の単純なミスであり、単純であるがゆえに調べてもなかなかヒットしなかったため記録として残します。

同じ状況に遭遇し、無駄撃ちはしたくない場合(AWS Cost Explorer APIは2021年現在1回あたり0.01 USDのため)、こちらの記録を参考としてください。

結論

悪い例:
start_date = "2021-08-01"
end_date = "2021-08-31"

正しい例:
start_date = "2021-08-01"
end_date = "2021-09-01"

と「1ヶ月分」を指定する際は、end_dateは31日ではなく翌月の1日を指定する。

背景

AWSの各サービス(S3やEC2など)でかかるコストはAWS Cost Explorerで確認することができます。
このAWS Cost Explorerはコンソールから確認することができるのですが、それ以外にもAPIを利用して、pythonで確認することができます。

今回、AWS以外のサービスのコストもまとめて算出するシステムを作成するためにAPIを用いました。

しかし、
AWS Cost ExplorerのAPIをpythonで利用して月ごとの算出を行った結果(以下API)の額

AWSコンソールからのCost Explorer(以下GUI)の同期間での額
が異なりました。
APIで算出した額がGUIの額より少なかったです。
この差分の原因を調査しました。

実際にAPI利用のために用いた関数は以下です。

※「tag_name」部分はAWS リソースのタグ付けによりつけたタグごとにコスト算出を目的としたためついていますが、人によっては不要と思いますので、不要な場合削除してください。

def get_all_cost_by_api(start_date,end_date,tag_name):

  response = client.get_cost_and_usage(
      TimePeriod={
          'Start': start_date,
          'End': end_date
      },
      Granularity='MONTHLY',
      GroupBy=[
      {
        "Type":"DIMENSION",
        "Key":"SERVICE"
      },
      {
        "Type":"TAG",
        "Key":tag_name
      }
    ],
     Metrics=["UnblendedCost"]
  )
  return response

start_date = "2021-08-01"
end_date = "2021-08-31" ### 悪い例。1ヶ月分を算出したい場合は"2021-09-01"
tag_name = "hoge"
response = get_all_cost_by_api(start_date,end_date,tag_name)

行った調査

Metrics

まず、Metricsに着目しました。
APIでは、こちらの記事:AWS Cost Explorerに渡す、Metricsの値の意味
を参考に、とりあえずUnblendedCostで算出しました。

GUIでは右下の方に「コストの表示方法」という項目があり、「非ブレンドコスト」となっておりました。
言語が日本語だったので英語に変えたところ、UnblendedCostでした。
よって、Metricsの問題ではなさそうでした。

算出期間の変更

1月分の算出から1日分の算出に変更したところ、額が一致しました。

仮設構築&確認

「1日分の算出だと値が一致する」
「APIの額がGUIの額より少ない」
ということから
「期間の指定方法が適切ではないのでは?」
という仮設を立てて確認を行いました。
Before

start_date = "2021-08-01"
end_date = "2021-08-31"
tag_name = "hoge"
response = get_all_cost_by_api(start_date,end_date,tag_name)

After

start_date = "2021-08-01"
end_date = "2021-09-01"
tag_name = "hoge"
response = get_all_cost_by_api(start_date,end_date,tag_name)

Afterで算出した額とGUIで表示された額が(四捨五入の有無はあれど)無事一致しました。

感想

APIとGUIで額が違うという事象に遭遇し、
「aws cost explorer api gui 額 違う」

「different results cost explorer api gui」
などで検索しても該当の事象に遭遇した人の記事がなかなかヒットせず、
1回あたり0.01USDのコストがかかるということで検証のための実行もやりづらかったです。
こちらの記事を書くことで、今後は同様の事象に遭遇した人の検索に引っかかると良いなと思います。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0