AWSの日毎のコストや当月のコストのサービス内訳をCloudWatchのダッシュボードでグラフとして表示する方法

こんちは、最近英会話頑張ってるmorimorikochanです

AWSの日毎のコストや当月のコストのサービス内訳をCloudWatchのダッシュボードでグラフとして表示させたのでそのやり方を共有します

1.CloudWatchで請求アラームが作成されるようにする

AWSアカウントがデフォルトの状態では、CloudWatchに対して請求の情報が送信されず、ダッシュボードに表示することができません。
なのでまずは請求の情報(公式ドキュメントでは請求アラームと呼ばれています)をCloudWatchに送信されるように設定しましょう。

  1. ルートアカウントでログインし アカウント にアクセス
  2. サイドメニューの請求設定にアクセス
  3. アラート設定情報編集を押下し、CloudWatch 請求アラートにチェックを入れて更新します
  4. 設定後はこんな感じになっていると思います
/img/2024-02-12.png

更新後のアラート設定

これによってその月の予想請求額が1日に数回、CloudWatchに送信されます。
なのでこのメトリクスはその月の間は上昇し続け次月になると0からスタートする、というようなメトリクスです。
その際のメトリクス名は請求/EstimatedChargesです。様々なディメンションが設定されているので使い勝手が良さそうです。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html

2.グラフを作成する

ダッシュボードに表示するグラフを作成します。
グラフの追加時に、以下のJSONを発信元としてペーストし保存します

{
    "metrics": [
        [ { "expression": "DIFF(m1)", "label": "日毎の費用", "id": "e1", "region": "us-east-1" } ],
        [ "AWS/Billing", "EstimatedCharges", "Currency", "USD", { "id": "m1", "visible": false, "stat": "Average", "period": 86400, "region": "us-east-1" } ]
    ],
    "view": "timeSeries",
    "stacked": false,
    "region": "us-east-1",
    "stat": "Maximum",
    "period": 21600,
    "start": "-PT336H",
    "end": "P0D",
    "title": "日別コスト推移",
    "yAxis": {
        "left": {
            "min": 5,
            "max": 15
        }
    }
}

するとこんな感じでグラフが表示されると思います。
この青線がその日に発生したコストをUSD単位で表しています。

/img/2024-02-12-1.png

表示されるグラフ

また、上記グラフでは全サービスの合計金額を表示していますが、サービス別のディメンションを利用すれば以下のような当月のコストのサービス内訳を表すグラフも表現が可能です

/img/2024-02-12-2.png

表示されるグラフ

{
    "metrics": [
        [ { "expression": "SORT(METRICS(), SUM, DESC)", "label": "", "id": "e1", "region": "us-east-1" } ],
        [ "AWS/Billing", "EstimatedCharges", "ServiceName", "AmazonAthena", "Currency", "USD", { "id": "m1", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonCloudWatch", ".", ".", { "id": "m2", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonCognito", ".", ".", { "id": "m3", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonEC2", ".", ".", { "id": "m4", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonECR", ".", ".", { "id": "m5", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonECS", ".", ".", { "id": "m6", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonRDS", ".", ".", { "id": "m7", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonRoute53", ".", ".", { "id": "m8", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonS3", ".", ".", { "id": "m9", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonSES", ".", ".", { "id": "m10", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonSNS", ".", ".", { "id": "m11", "visible": false, "region": "us-east-1" } ],
        [ "...", "AmazonVPC", ".", ".", { "id": "m12", "visible": false, "region": "us-east-1" } ],
        [ "...", "AppFlow", ".", ".", { "id": "m13", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSCostExplorer", ".", ".", { "id": "m14", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSDataTransfer", ".", ".", { "id": "m15", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSELB", ".", ".", { "id": "m16", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSGlue", ".", ".", { "id": "m17", "visible": false, "region": "us-east-1" } ],
        [ "...", "awskms", ".", ".", { "id": "m18", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSLambda", ".", ".", { "id": "m19", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSMarketplace", ".", ".", { "id": "m20", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSQueueService", ".", ".", { "id": "m21", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSSecretsManager", ".", ".", { "id": "m22", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSServiceCatalog", ".", ".", { "id": "m23", "visible": false, "region": "us-east-1" } ],
        [ "...", "awswaf", ".", ".", { "id": "m24", "visible": false, "region": "us-east-1" } ],
        [ "...", "AWSXRay", ".", ".", { "id": "m25", "visible": false, "region": "us-east-1" } ]
    ],
    "view": "bar",
    "stacked": true,
    "region": "us-east-1",
    "setPeriodToTimeRange": true,
    "stat": "Maximum",
    "period": 21600,
    "title": "今月のコスト内訳"
}

注意点

いくつか注意点があります。

  • AWSの日毎のコストのグラフについて
    • 月を跨ぐ際に2日間だけ数値が正しくありません。
      • 日毎にEstimatedChargesの最大値を割り出しそれの差分をグラフ化することで、日時のコストを算出しています。
      • なので、例えば1/31は100USDで2/1は3USD、というような場合は、2/1のデータは -97USDとなってしまいます。
    • 日毎に多少の誤差は出ます
      • 最大値を算出する基準となる時間によって変化します。
      • なので、朝に見たグラフと夜に見たグラフは少し見た目が変わっている可能性があります。
  • AWSの当月のコストのサービス内訳について
    • 新しいサービスを利用する際には、新しいディメンションが増えるため、グラフを更新する必要があります。
    • このウィジェットの隣に合計金額のウィジェットを出しておく仕組みがあると、気付きやすそうに感じています。

See also