🙄

AWS Cost Explorer のウォッチ力をあげるTips

2024/04/22に公開

はじめに

AWSでコスト最適化を検討する人がみな使うAWS Cost Explorer、なんとなく使っている方も多いのではないでしょうか。

私もその一人だったので、ちゃんと使いこなすべくこの記事を書きました。

レポートパラメータを使いこなそう

AWS Cost Explorerのグラフは、レポートパラメータを調整することで、見たいスコープでコスト推移を確認できます。つまり、レポートパラメータを使いこなせれば、AWSアカウントのコストのボトルネックを見つけられるようになります。

レポートパラメータ

1.時刻

時刻としては、「日付範囲」と「粒度」を指定できます。

日付範囲

カレンダーで範囲選択することも、「開始日」「終了日」の入力フォームへの直接入力することもできます。なお、自動選択範囲(相対)機能が便利でして、例えば「過去1か月間」を有効にしていれば、後日みても「その日から過去1か月間」のグラフをすぐに確認できます。

日付範囲

また、別途「予測」を有効にしておくことで、未来の日付をいれた場合もグラフを作成できます。
ただ「予測」は後述する「グループ化の条件」で何かしらを指定している場合は使えませんので、私は基本的に使っておりません。

粒度

グラフの細かさを、「毎時」・「日別」・「月別」のいずれかに選択できます。

このとき、日付範囲が広いとグラフがとても細かくなってしまいます。そのため、長年運用しているアカウントであれば基本的には「月別」で確認し、コスト最適化前後の状況確認する際は「日別」で確認するのがやりやすいです。

「毎時」に関しては、日付範囲の上限が14日間になります。また、支払者アカウントからしか設定の有効化ができなかったり、追加でコスト(1000行あたり 0.01USD)が発生したりします。
ほとんどの場合「毎時」で確認しなくてもコスト状況を分析できますので、「毎時」は使いたい要望がなければ、設定を無効化しておくと無難です。
(異常が発生してコストが急増するのを検知したい場合は、AWS Cost Anomaly Detectionを用いて通知できますので。)

2.グループ化の条件(ディメンション)

何も設定していない状態でグラフを見ると、そのタイミングでの合計コストしかわからないため、グループ化の条件として、何かしらの範囲(ディメンション)を指定することを推奨します。

サービス

グラフ内で、サービスごとにどれくらいコストがかかっているのかの内訳を見れます。私が一番使っているディメンションです。
後述する「フィルター」と組み合わせることで、たいていのボトルネックは特定できます。

基本的には下記図のように「EC2インスタンス」や「S3」のようにサービス名で金額が表示されます。ただ「EC2その他」のような例外があります。

サービスごとにグループ化した棒グラフ

例外的な項目の詳細は下記の通りです。

項目 詳細
EC2 その他 EBSやElasticIPなど、EC2インスタンス関連のサブ的なサービス。この内訳を分析したい場合は、後述する「使用タイプ」を用いてください
その他 内訳のTop9より下のサービス全て。(グラフでは最大10色で表示する仕様のため)なお、グラフの配下にある「コストと使用量の内訳」には、全サービスのコストが細かく表示されます
Tax 税金

連結アカウント

グラフ内で、組織内のAWSアカウントごとのコスト内訳を見れます。
チームごとにAWSアカウントを分けている場合でも、どのAWSアカウントのコストがどれくらいかかっているのかを一つの画面で見れるのは便利だなと思っております。

リージョン

グラフ内で、リージョンごとのコスト内訳を見れます。
この設定によって「想定外のリージョンで、実はコストがかかっていた」場合に瞬時に認識できます。

(もちろん、利用するリージョンだけ、リソース作成をIAMで許可するに越したことはないです。)

インスタンスタイプ

グラフ内で、どのインスタンスタイプ(EC2だけでなくDBも)ごとのコスト内訳が見れます。
インスタンスタイプについては、AWS Compute Optimizerで提示された結果をもとに調整している方も多いかと思いますが、この設定でインスタンスタイプごとにみると「どれくらいの金額感で、Graviton対応できているか」「コストが高すぎるインスタンスタイプがないか」を瞬時に確認できて便利です。

使用タイプ

サービスごとにどれくらいコストがかかっているのかの内訳は「サービス」で見ましたが、具体的にサービス内の何の用途にどれくらいコストがかかっているかを確認する際は、こちらの「使用タイプ」を見ます。

「使用タイプ(UsageType)」はAWS Cost and Usage Report(AWS CUR)の明細で表示される明細項目の一つ lineItem/UsageTypeの情報をとってきています。

項目例 詳細
APN1-InstanceUsage:db.t3.medium 東京リージョンでdb.t3.mediumインスタンスを利用して発生したコスト
APN1-LoadBalancerUsage 東京リージョンでロードバランサーを利用して発生したコスト

使用タイプの表示パターンは、大まかにはこのようになっております。

項目の表示パターン 具体例
[利用リージョン]-[利用用途] APN1-LoadBalancerUsage、APN1-NatGateway-Hours
[利用リージョン]-[連携先リージョン]-[利用用途] APN1-APN3-AWS-Out-Bytes、APN3-APN2-AWS-In-Bytes

[利用リージョン]は「AP:アジアパシフィック」「EU:ヨーロッパ」「US:アメリカ」のように区分されており、主要なリージョンの表記は下記の通りとなっております。

[利用リージョン]の例 該当リージョン
APN1 アジアパシフィック(東京)
APN2 アジアパシフィック(ソウル)
APN3 アジアパシフィック(大阪)
APS1 アジアパシフィック(シンガポール)
APS2 アジアパシフィック(シドニー)
CAN1 カナダ(中部)
CNN1 中国(北京)
EUS1 欧州(ミラノ)
EUW2 欧州(ロンドン)
USE1(または記載なし) 米国東部(バージニア北部)
USE2 米国東部(オハイオ)
USW2 米国西部(オレゴン)

[利用用途]としては、以下のような例があります。

[利用用途]の例 該当する利用用途
BoxUsage:t2.large t2.largeのオンデマンドインスタンスを利用して発生したコスト
EBS:VolumeUsage EBSのボリュームを利用して発生したコスト
Aurora:BackupUsage Auroraのバックアップを利用して発生したコスト
CW:AlarmMonitorUsage CloudWatchのアラーム機能にて標準(メトリクスアラーム)を利用して発生したコスト
ElasticIP:IdleAddress 作成されているElasticIPが使われていないことによって発生したコスト
VpcEndpoint-Bytes VPCエンドポイントを利用して発生したコスト
DataScanned-Bytes データスキャンして発生したコスト
CloudFront-In-Bytes CloudFrontから利用リージョンへデータを転送(In)した際のコスト
CloudFront-Out-Bytes CloudFrontから利用リージョンへ転送(Out)した際のコスト
AWS-In-Bytes 連携先リージョンから利用リージョンへデータを転送(In)した際のコスト
AWS-Out-Bytes 連携先リージョンから利用リージョンへデータを転送(Out)した際のコスト

このように、いくつかの[利用用途]に関しては文字列を見て、どのような用途か判別できます。しかしながら、このままでは特定が難しい使用タイプもあります。

そこで、後述する「フィルター」機能を用いて、特定のAWSサービスに関する使用タイプのみを確認できるように「サービス」で絞り込みして確認することを推奨します。
絞り込んだサービスの課金体系を確認しながら、どのような理由で課金されているのかを分析する流れです。

またサービスによっては、これらの文字列の詳細について説明してくれているページがあります。ここでは、CloudFrontとS3とCloudWatchのページを載せておきます。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/billing-and-usage-interpreting.html

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/aws-usage-report-understand.html#aws-usage-report-understand-more-info

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch_billing.html#w13aac11b9:~:text=次の表に、各 CloudWatch 機能の名前、各サブ機能の名前、および UsageType の文字列を示します。

細かくひとつひとつを見ていくのは大変なところでもありますので、個人的には、全てのサービスの使用タイプを把握する必要性はないかなと考えております。
ボトルネックになっているサービスが、具体的に何でお金がかかっているかにフォーカスして都度分析することをオススメします。

リソース

リソースごと(例:EC2インスタンス1つごと)に、コスト内訳を見れます。

利用するためには「時間単位およびリソースレベルのデータ粒度」の情報が必要です。これは、グラフの細かさを「毎時」とするときと同様に、支払者アカウントからしか設定を有効化できない有料機能になります。

リソース1つ1つごとにコスト内訳が見れるのは便利ですが、分析する方法は他にいくらでもありますので、個人的にはこれを利用しなくても良いかなと思っております。

コストカテゴリ

選択したAWS Cost Categoriesの値ごとのコスト内訳を見れます。

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/manage-cost-categories.html

AWSアカウントを利用しているチームが複数ある場合はAWS Cost Categoriesでカテゴリ分けをしておくと、それぞれのチームのコストが瞬時に判別できて便利です。

なお、複数のチームで共有のリソースを利用している場合もあると思いますが、そのときも共有リソースのコストを分割する機能がありますので、これを用いてチームごとにコストをあてられます。

タグ

選択したAWS コスト配分タグの値ごとのコスト内訳を見れます。このとき、すべてのタグが選択できるるわけではなく、コスト配分タグとしてアクティベートしたタグのみが選択できます。

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html

タグは、ありとあらゆるリソースにつける必要がありますが、同じAWSアカウントを使っている他メンバーにお願いしても、タグをつけてもらえなかったり、微妙に間違ったタグがついてしまったりすることがあります。
そういうときのために、AWS Organizationsでタグポリシーを設定したり、IAMポリシーで「特定の自作タグに値の設定がないときは、リソースを起動できない」ようにしたりすることを推奨します。

また、AWS 生成コスト配分タグであるaws:createdByを活用することをオススメします。これは、ユーザ側でのタグの値設定なしで、リソース作成者ごとの利用料金が特定できる優れものです。
このとき、直接コンソールにログインしているIAMユーザだけでなく、AssumedRoleや、Federatedユーザも識別できます。SSOを活用している人は多いと思いますので、これは嬉しい機能だなと思っております。

また、AWS CDKやAWS CloudFormationを使っている場合は、aws:cloudformation:logical-id、aws:cloudformation:stack-id、aws:cloudformation:stack-nameといった他のAWS生成コスト配分タグもありますので、そちらをお使いください。

APIオペレーション

グラフ内で、各種AWSサービスに対するリクエストや、その実行タスクごとの内訳が見れます。

項目例 詳細
NatGateway NatGatewayを利用して発生したコスト
CloudWatchLogs CloudWatchLogsを利用して発生したコスト
CreateSnapshot EC2インスタンスのスナップショットを作成して発生したコスト
RunInstances EC2インスタンス(Linux/UNIX)の起動によって発生したコスト
RunInstances:0010 EC2インスタンス(Red Hat Enterprise Linux)の起動によって発生したコスト。他の数字の場合はこちら

使用タイプと同様に、このまま見ても特定が難しいAPIオペレーションもあります。なので、これを用いる時は、後述する「フィルター」機能の「サービス」で、どのAWSサービスに関するオペレーションを確認するかを絞り込みます。

そして、絞り込んだサービスの課金体系を確認しながら、どのような理由で課金されているのかを確認します。

例えば、S3で絞り込んだ時に「StandardStorage」「GlacierInstantRetrievalStorage」という項目がありました。これらはS3のストレージクラスのひとつであり、これらを利用するとコストがかかるから項目が存在しておりました。
他にも、「PutObject」や「GetObject」という項目もありました。これらはS3で行われるアクションのひとつであり、ここでコストが発生しているため項目が存在しておりました。

細かくひとつひとつを見ていくのは大変なところでもありますので、個人的には、全てのサービスのAPIオペレーションを把握する必要性はないかなと考えております。
ボトルネックになっているサービスが、具体的に何でお金がかかっているかにフォーカスして都度分析することをオススメします。

アベイラビリティゾーン

グラフ内で、アベイラビリティゾーンごとのコスト内訳を見れます。

プラットフォーム

「Red Hat Enterprise Linux」や「Linux/UNIX」、「Windows」といったOSごとにどれくらい料金がかかっているかを確認できます。

購入オプション

Amazon EC2の購入方法ごとの金額を確認できます。

項目 詳細
On Demand オンデマンド購入(デフォルト設定)
Savings Plans Savings Plansで購入。詳しくはこちら
Reserved リザーブドインスタンスとして購入。詳しくはこちら

コスト最適化をする際、Saving Plansやリザーブドインスタンスの利用はとても効果的です。
そのため、この設定を見て、これらを効果的に使えているかどうかを確認しておくと良いかなと思います。

テナンシー

Amazon EC2を利用する際、物理サーバを他のユーザと共有するか専用するか選択するオプションがあり、このオプションごとにかかっている金額を確認できます。

項目 詳細
Shared 物理サーバを他のユーザと共有する場合の設定(デフォルト設定)
Dedicated 物理サーバを該当AWSアカウントで占有する設定。くわしくはこちら
Host 物理サーバを起動するインスタンス専用として利用する場合の設定。くわしくはこちら

データベースエンジン

「MySQL」や「PostgreSQL」、「Aurora MySQL」といったデータベースエンジンごとにどれくらい料金がかかっているかを確認できます。

個人的に、Auroraか否かも分類してくれている点が良いなと思っております。

請求エンティティ

AWSの利用料なのか、AWS Marketplaceの利用料なのかの内訳が見れます。

法人

「Amazon Web Services Japan G.K.」や「AMCS LLC」といった、請求元の法人の内訳が見れます。

Amazonグループ外の法人(例えば、生成AI関連を利用している場合は「Anthropic, PBC」や「CohereAI」とか)の場合もここに記載されます。

料金タイプ

請求された料金のタイプの内訳が見れます。

項目 詳細
Usage AWSアカウントの利用料
予約の前払い料金 リザーブドインスタンス等の予約を前払いで購入した料金
定期的な予約料金 定期的に予約購入している料金
適用された予約の使用 予約割引の適用状況
Savings Plan の前払い料金 Savings Planを前払いで購入した料金
Savings Plan の定額料金 Savings Planの定額サブスクリプション料金
Savings Plan の対象使用量 Savings Planの適用状況
Savings Plan の取り消し Savings Plan 特典による相殺コスト(マイナスで料金表示)
サポート料金 サポートプランに応じた定額サブスクリプション料金
その他の別枠料金 前払い予約料金やサポート料金以外のサブスクリプション料金
Credit アカウントに適用したAWSクレジット
Tax 税金

3.フィルター

「フィルター」を用いると、該当する条件にあてはまるコストのみを表示することができます。このとき、該当する条件のものを除外することもできますし、複数の条件を組み合わせて適用することもできます。

フィルター区分としては、「ディメンション」と同じ項目(「サービス」・「連結アカウント」・「リージョン」・「インスタンスタイプ」・「使用タイプ」など)が適用できます。

唯一、「使用タイプ」に関しては、一つひとつフィルタリング設定するのが大変なケースも多いのでいくつかのタイプをグルーピングした「使用タイプグループ」があります。

そして、主要な「使用タイプグループ」一覧は、フィルタリング設定について解説している公式ドキュメントに記載があります。

https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/ce-filtering.html

ちなみに、「使用タイプグループ」には他にも「S3: Storage - Glacier」といったフィルタリングの詳細条件が異なるものや、「OpenSearchService: Running Hours」といった他サービスの条件もあります。

色々なサービスを利用していると、知らず知らずのうちに、「使用タイプグループ」のフィルタリング項目が増えていると思いますので、ぜひ時間があるときにでも見てみてください。

4.詳細オプション

この項目では、コスト集計にあたってのその他のオプションを指定できます。

次で集計したコスト

どの集計方法でコストを表示するかを選択できます。

項目 詳細
非ブレンドコスト 請求された日にコストを計上します。リザーブドインスタンスやSavings Planを購入している場合、コスト請求日(例:定期購入していたら毎月初日)に計上されます。
償却コスト 請求期間全体に対する実行コストです。リザーブドインスタンスやSavings Planを購入して、それを利用している場合、1日あたりの利用料を「償却コスト」として計算し、期間に応じて計上されます。 購入したものの利用していない場合は、その月の初日に表示となります。
ブレンドコスト AWS Organizationsを用いて複数のAWSアカウントの一括請求機能を使用している場合に、請求全体の平均使用コストを表示します。このとき、リザーブドインスタンスやSavings Plan、オンデマンドインスタンス等の平均コストと、各アカウントのサービス使用量を掛け算します。
非ブレンド純コスト 割引を利用している場合に、非ブレンドコストに割引を適用した後の数値を表示します。
純償却コスト 割引を利用している場合に、償却コストに割引を適用した後の数値を表示します。

基本的には、請求書と同じ「非ブレンドコスト」を見ることが多いと思いますが、コスト最適化活動をする際は、リザーブドインスタンスやSavings Plan、AWSクレジット等も駆使されていると思いますので、適宜表示方法を変えて確認することを推奨します。

その他のデータ設定

下記の表示設定を、それぞれオンオフできます。

項目 詳細
予測される値を表示 「予測」を有効にしている場合、未来の予測値も表示できます。
タグ付けされていないリソースのみ表示 AWS コスト配分タグがついていないリソースのみを表示できます。AWS コスト配分タグについてはこちら
カテゴリ化されていないリソースのみを表示 AWS Cost Categoriesに分類されていないリソースのみを表示できます。AWS Cost Categoriesについてはこちら

おわりに

コスト最適化としてはAWS Cost and Usage Reports (CUR) やAWS Trusted Advisorなど、他にも様々な便利ツールがあるので、そちらもあわせてご確認ください。

このまとめ記事が、少しでも参考になれば幸いです!

Discussion