Safie Engineers' Blog!

Safieのエンジニアが書くブログです

AWS Cost Categories でコスト集計作業を効率化

こちらは セーフィー株式会社 Advent Calendar 2022 の 14日目の記事になります。

はじめまして。セーフィーでインフラエンジニアをしている近江です。 セーフィーでは AWS の各サービスごとのコストを詳細に把握するため、"AWS Cost Categories" という AWS のサービスを使用しています。本記事では AWS Cost Categories とは何か、どのようなシーンで活用できるのか、実際の設定方法、気をつけるポイントについて書いていきたいと思います。

AWS Cost Categories とは

AWS Cost Categories 概要ページ

AWS Cost Categories は AWS Billing の請求関連のサービスの 1つです。 AWS によるクラウド財務管理のページでは ビジネスロジックに沿ったコスト配分戦略の構築 のコストの整理を提供するサービスの 1つとして挙げられています。コストの整理の機能には他にコスト配分タグ (AWS cost allocation tags) があり、こちらは利用されることが多く、ご存じの方が多いかと思います。しかし AWS Cost Categories はそこまで知られているサービスではないのかなという印象です。

2022年11月現在、AWS Cost Categories では主に以下のような機能が提供されています。

  • 独自に定義したルールからコスト情報をマッピングしてコストカテゴリを作成
  • 分割料金ルールを使用して、コストカテゴリ値の間で料金を配分
  • コスト管理機能でコストカテゴリ別に使用量を表示

AWS Cost Categories サービスページより

コストカテゴリとは

AWS Cost Categories ではコストカテゴリというものを作成して AWS のコストをカテゴリで分割することが可能です。 コストカテゴリはユーザー側が細かく定義することが可能で、アカウント、タグ、サービス、料金タイプ、別のコストカテゴリなどを指定してルールを作成できます。

作成したコストカテゴリは AWS Cost Explorer、AWS Budgets、AWS Cost and Usage Report (CUR) などの他のコスト管理機能から使用できます。

Cost Explorer のグループ化としてコストカテゴリを指定した際の画面のキャプチャ

セーフィーは複数の AWS アカウントがあり、一部のサービスは複数のアカウントを横断してリソースがあります。Cost Explorer のグループ化の条件としてコストカテゴリを使用することでサービスごとのコスト状況が一発で分かります。更にフィルターを追加してサービスごとのデータ通信量だけを把握したりも可能です。

利用料金

AWS Cost Categories 利用料金は無料です。

Q: Is there a cost associated with using AWS Cost Categories?

This service is provided free of charge.

AWS Cost Categories FAQs - Amazon Web Services より

AWS Cost Categories を活用できるシーン

例えば、以下のような一括請求が有効な 3つの AWS アカウントがあり、コスト配分タグ CostAllocation がついたリソースのある環境があるとします。

このような複数アカウントの環境で、以下のようにプロジェクトごとにコストを集計したいという要件が上がったとします。

  • プロジェクトA
    • コスト配分タグ CostAllocationServiceAServiceB がついているリソースが対象
  • プロジェクトB
    • アカウントA のうち、コスト配分タグ CostAllocation がついていないリソースが対象
  • プロジェクトC
    • アカウントC が対象
  • 上記以外

このような要件で実際にコストを把握したい場合、一般的には以下のようにするかと思います。

  • Cost Explorer から条件を指定してプロジェクトごとに集計
  • 新たにコスト配分タグを全てのリソースに付ける

しかし Cost Explorer を使う場合はプロジェクトの数に応じて集計回数が増えてしまってかなりの手間になります。新たにコスト配分タグを付ける場合は既存のリソースへのタグの設定変更が必要になり、コスト配分タグを有効化するより前の集計ができないなどのデメリットがあります。

そこで登場するのがコストカテゴリです。 コストカテゴリを用いることで、コスト配分タグの新たな有効化や既存のリソースへのタグ追加をする必要はありません。また Cost Explorer でコストカテゴリを指定してグループ化することで、一度にプロジェクトごとにコストを把握することが可能になります。

コストカテゴリの作成とルール設定

ここでは先程の活用できるシーンの設定例を想定して実際にコストカテゴリを作っていきます。

請求ダッシュボード (AWS Billing Dashboard) ページの左側の Cost categories をクリックします。

コストカテゴリを作成 をクリックして作成します。


コストカテゴリの名前 (キー名) を設定するページが表示されます。

名前は今回 Test01 としました。名前は後から変更不可なので注意してください。

またルックバック期間も設定できます。通常はコストカテゴリを作成した当月のみ遡って使用できますが、ルックバック期間を設定すると最大12ヶ月間遡ってコストカテゴリを使用することが可能になります。 AWS Cost Categories がルールの遡及適用のサポートを開始

設定して 次へ をクリックします。


コストカテゴリの値とルールを設定するルールビルダーのページが表示されます。 各プロジェクトを想定してルールを設定していきます。

  • 値:ProjectA
  • 条件
    • コスト配分タグ CostAllocation の値が ServiceAServiceB

一括請求の管理アカウントでは複数の AWS アカウントに設定されたコスト配分タグが対象です。


  • 値: ProjectB
  • 条件
    • アカウントID が 111111111111 (アカウントAを想定)
    • コスト配分タグ CostAllocation が存在しない

コストカテゴリではルールが上から処理され、コストに一度だけ適用されます。 ProjectA のルールでアカウントA に CostAllocation の値 ServiceAServiceB を持つリソースがあっても、ProjectB の値には反映されません。


  • 値: ProjectC
  • 条件
    • アカウントID が 3333333333333 (アカウントCを想定)

  • デフォルト値

デフォルト値を設定すると、全てのルールに一致しないコストは設定した値が使用されます。デフォルト値を設定しない場合は NoValue 扱いになります。

設定したら 次へ をクリックします。


オプションの分割請求の定義のページが表示されます。

分割請求を設定することで、特定のコストカテゴリの値を別の値に振り分けることができます。

こちらは設定しても Cost Explorer などには反映されず、コストカテゴリのページ中のみ反映されるため注意してください。

注: 分割請求は AWS Cost Categories でのみ利用できます。この機能は、他のコスト管理機能 (例えば、Cost Explorer、Cost and Usage Reports) には表示されません。

ここまで設定し、コストカテゴリを作成 をクリックすると作成されます。


コストカテゴリが作成されました。

ステータスが最初は 処理中 になります。 作成した日が月の後半だったりルックバック期間が長いと処理が完了するまでに数時間かかることもあります。気長に待ちましょう。


分類分けされたコストがある場合は以下のように色分けされて分かりやすく表示されます。

ルールに継承された値 (INHERITED VALUE) を使用する

ルールタイプを 継承された値 (INHERITED VALUE) にすることで、値を自動的に生成することが可能です。

継承された値: このルールタイプにより、定義されたディメンション値からコストカテゴリの値を動的に継承するルールを定義する柔軟性が追加されます。

コスト配分タグ もしくは アカウント が指定可能です。 自動的に値を設定してくれるため、全ての値をルールにいちいち指定するような手間をなくすことができます。

気をつけるポイント

コストカテゴリで使用できるディメンション

ルールで指定するディメンションですが、Cost Explorer のものとは異なるようです。 例えばディメンションにサービスにした場合に値として AWSDataTransfer が指定できますが、これは Cost Explorer では指定できません。料金タイプの方も若干異なるようなので、設定する際には気をつけましょう。

OR 条件は root レベルでは使えない

複雑な条件を使いたい場合には JSON でルールを指定でき、OR 条件も使うことが可能になります。 しかし以下の JSON のような Rule 直下に OR を指定することはできません。

{
    "RuleVersion": "CostCategoryExpression.v1",
    "Rules": [
        {
            "Type": "REGULAR",
            "Value": "ProjectA",
            "Rule": {
                "Or": [
                    {
                        "Dimensions": {
                            "Key": "LINKED_ACCOUNT",
                            "Values": [
                                "111111111111"
                            ],
                            "MatchOptions": [
                                "EQUALS"
                            ]
                        }
                    },
                    {
                        "And": [
                            {
                                "Tags": {
                                    "Key": "CostAllocation",
                                    "Values": [
                                        "ServiceB"
                                    ],
                                    "MatchOptions": [
                                        "EQUALS"
                                    ]
                                }
                            },
                            {
                                "Dimensions": {
                                    "Key": "LINKED_ACCOUNT",
                                    "Values": [
                                        "222222222222"
                                    ],
                                    "MatchOptions": [
                                        "EQUALS"
                                    ]
                                }
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

こちらを JSON エディタに入力しても、以下の検証エラーが出てしまい、適用することができません。

検証エラー Failed to create Cost Category: Expression cannot contain OR on root level

このような root レベルの OR が可能であれば、簡単にコストを足し合わせて算出できるのですが…。 できないため、コストカテゴリを入れ子にすることで回避することが可能です。

  1. 先に別のコストカテゴリで合算したいルール条件ごとに値を作成してコストカテゴリを作成する
  2. 別のコストカテゴリから先に作ったコストカテゴリをディメンションに指定し、値を全て指定する

また、設定したい OR 条件と、全てに合致する適当なディメンションの条件で AND 条件を使うことでも無理やり回避可能です。しかしかなり分かりにくくなるためあまり使わないほうがいいかと思います。

コストカテゴリの削除

コスト配分タグと同じですが、コストカテゴリを削除しても Cost Explorer 上のコストカテゴリの選択欄からは消えません。 コストカテゴリのキー名は後から変えることが不可能なため、検証する際は注意が必要です。

まとめ

AWS Cost Categories を利用することでコスト集計作業を効率化する事ができます。 「Cost Explorer のフィルターでタグから複数の値を選択しているけど面倒だし一つにまとめたい」 このようなシーンでもコストカテゴリを使って効率化可能なので、集計の手間を感じたら利用を検討してみてはいかがでしょうか。

© Safie Inc.