Cost Anomaly Detection の通知を AWS User Notifications でフィルタリングして通知する (5/29 公開時点で通知待ちです。▶ 5/30 に通知きました。)

記事タイトルとURLをコピーする

こんにちは🐱
カスタマーサクセス部の山本です。
最近は暑くて、ランニングしていたらセミの鳴き声の幻聴が聞こえました。

Cost Anomaly Detection の通知を AWS User Notifications でフィルタリングして通知する

2025 年 5 月 21 日のアップデートで発表されました。

AWS Cost Anomaly Detection enables advanced alerting through AWS User Notifications - AWS

前提:コストモニターを作成

コストモニターを作成すると、異常検出時に EventBridge にイベントを発行します。
AWS User Notifications では、このイベントをもとに通知を発行します。

請求とコスト管理のサービス画面を開きます。

「コスト異常検出」の画面から、モニターを作成しましょう。

「AWS のサービス」を選択すると、使用中の AWS のサービスごとに異常を検出するようになります。
EC2 で異常検知したよ!今度は RDS で異常検知したよ!次は ECS で異常検知したよ!といった具合に、AWS のサービスごとに異常を検出します。
ちなみに Organizations 環境の管理アカウントで設定すると、管理下のすべてのアカウントの各 AWS サービスを評価してくれます。

「アラートサブスクリプション」では AWS のサービスごとに予想支出を 1 ドル上回ったら、SNS トピックに通知するようにしています。
この通知は AWS User Notifications での通知とは異なります。

コストモニターができました。

「AWS のサービス」で異常を検出するようになっています。

「アラートサブスクリプション」が 1 つ関連付いています。

「アラートサブスクリプション」では、1 ドルを超えたら、通知するようになっています。

しきい値の設定は「アラートサブスクリプション」でしている点がポイントです。
このとき「コストモニター」側では 各 AWS のサービスのすべての異常を検出して、イベントを発行しています。1 ドルを超えたものを見つけて、SNS トピックに通知しているのは「アラートサブスクリプション」なのです。

「AWS のサービス」でコストモニターを作成すると、しきい値に関係なく、すべての異常の検出を、AWS のサービスごとに行っているということです。

コストモニターが異常を検出すると、EventBridge にイベントを発行します。
以下は例です。公式ドキュメント「AWS ユーザー通知をコスト異常検出に使用する」より。
9 行目のresources セクションに記載のモニターからイベントを発行しています。
AWS User Notifications では、このイベントを使用します。

{
    "version": "0",
    "id": "<id>", // alphanumeric string
    "source": "aws.ce",
    "detail-type": "Anomaly Detected",
    "account": "<account ID>", // 12 digit account id.
    "region": "<region>", // Cost Anomaly Detection home region.
    "time": "<date>", // Format: yyyy-MM-dd'T'hh:mm:ssZ
    "resources": [ 
         "arn:aws:ce::123456789012:anomalymonitor/abcdef12-1234-4ea0-84cc-918a97d736ef"
    ],
    "detail": {
         "accountName": "<account name>",
         "anomalyEndDate": "2021-05-25T00:00:00Z",
         "anomalyId": "12345678-abcd-ef12-3456-987654321a12",
         "anomalyScore": { 
            "currentScore": 0.47,
            "maxScore": 0.47
         },
         "anomalyStartDate": "2021-05-25T00:00:00Z",
         "dimensionalValue": "ServiceName",
         "feedback": "string",
         "impact": {
            "maxImpact": 151,
            "totalActualSpend": 1301,
            "totalExpectedSpend": 300,
            "totalImpact": 1001,
            "totalImpactPercentage": 333.67
         },
         "rootCauses": [ 
            {
                "linkedAccount": "AnomalousLinkedAccount",
                "linkedAccountName": "AnomalousLinkedAccountName",
                "region": "AnomalousRegionName",
                "service": "AnomalousServiceName",
                "usageType": "AnomalousUsageType",
                "impact": {
                    "contribution": 601,
                }
            }
        ],
        "accountId": "<account ID>", // 12 digit account id.
        "monitorArn": "arn:aws:ce::123456789012:anomalymonitor/abcdef12-1234-4ea0-84cc-918a97d736ef",
        "monitorName": "<your monitor name>",
        "anomalyDetailsLink": "https://console.aws.amazon.com/cost-management/home#/anomaly-detection/monitors/abcdef12-1234-4ea0-84cc-918a97d736ef/anomalies/12345678-abcd-ef12-3456-987654321a12"
    }
}

必要に応じて:アラートサブスクリプションの削除

通知を AWS User Notifications に集約する場合など、必要に応じてアラートサブスクリプションを削除します。

AWS User Notifications 設定

下のドキュメントに設定例がいくつかあるので、試してみましょう。

次のフィルターでは、合計影響額が 100 ドルを超え、かつ全体のコストへの影響率が 10% を超える異常を通知できます。
金額と割合の 2 つの条件を組み合わせることが出来ます。

{
    "source": ["aws.ce"],
    "detail-type": ["Anomaly Detected"],
    "detail": {
        "Impact": {
            "TotalImpact": [{
                "numeric": [">", 100]
            }],
            "TotalImpactPercentage": [{
                "numeric": [">", 10]
            }]
        }
    }
}

「アラートサブスクリプション」で「しきい値」を設定した際には、金額と割合はいずれか 1 つのみ選択可能でした。

アラートサブスクリプションの画面:

AWS User Notifications のサービス画面に遷移しましょう。

通知設定を作成します。

  • AWS のサービスの名前:AWS Cost Explorer
  • イベントタイプ:Anomaly Detected
  • リージョン:US East (N. Virginia)、Asia Pacific (Osaka)、Asia Pacific (Tokyo) ※使用中のリージョンとしました。例えば 「ハッカーによって普段は使用していないオレゴンリージョンに EC2 を作成された。」みたいな状況もあるので、すべてのリージョンを選択しても良さそうです。

「高度なフィルター」に先程例に挙げた json を貼り付けます。

集約設定は 5 分としました。
通知頻度が多い場合に集約することが出来ます。

配信チャンネルに E メールと、Slack チャンネルを入れて、通知設定を作成します。

E メールに email-verification@aws.com から確認メールが来ていましたので、Verify Email をクリックしました。

通知設定ができました。

「イベントパターン JSON」には、「高度なフィルター」に設定した json が記載されていました。

「マネージドルール」をクリックすると、3 つあります。

US East (N. Virginia)、Asia Pacific (Osaka)、Asia Pacific (Tokyo) の 3 リージョンを選択したため、3 つのリージョンのEvent Bridge にルールを作成しているようです。

東京:

バージニア北部:

大阪:

ルールは Cost Anomaly Detection のイベントをすべて検出するものでした。
この検出結果に「イベントパターン JSON」でのフィルターを更に追加して、通知しているのだと思います。

{
  "source": ["aws.ce"],
  "detail-type": ["Anomaly Detected"]
}

高度なフィルターを空にして作成してみる。

高度なフィルターを空にして、東京リージョン (ap-northeast-1)とバージニア北部 (us-east-1) を選択して、通知設定を作成してみました。

このときは「イベントパターン JSON」が空欄になり、すべての検出を通知するようになります。

通知 (5/29 公開時点で検出結果待ちです。▶ 5/30 に通知きました。)

さて、設定したものの、まだ通知は来ません。
Cost Anomaly Detection では、Cost Explorer のデータを使用します。
Cost Explorer のデータ到着には最大で 24 時間の遅延があります。
また、コストモニターを作成してから 24 時間は検知が開始されないということもあるようです。
「異常検出」は「普段とは異なる状態」を検知することになりますので、通常時のデータが必要だったりもするのでしょう。

コスト異常検出は、最大 24 時間の遅延がある Cost Explorer のデータを使用します。そのため、使用が発生してから異常を検出するまでに最大 24 時間かかる場合があります。新しいモニターを作成した場合、新しい異常の検出を開始するまでに 24 時間かかることがあります。新しいサービスサブスクリプションの場合、そのサービスの異常を検出するには、10 日間のサービス使用状況履歴データが必要です。

約 12 時間後に通知が来ていました。

集約通知:

1 つの通知:

ユースケース

リリースのニュースから抜粋します。

コストモニタリングをカスタマイズできます。トレーニング中に自然にコストが急上昇する機械学習サービスには高いしきい値を設定し、データベースなどの安定したサービスには小さな変更が設定の問題を示している可能性があるため、低いしきい値を設定することができます。

ニュースからの所感:これまでの「金額」か「割合」のいずれかで検知するような仕組みでは、金額感の異なる複数サービスを使っている場合に、「しきい値」のチューニングが難しいということがあったと思います。AWS アカウント 1 つあたりの予算が決まっている場合には、ある程度の金額で設定できたのですが、予算をあまり決めずに AWS を使い始めたばかりの場合などは「EC2 / RDS はいくらかかるのが普通なのか」が分からないと思います。そういった際に通知を受け取りすぎてチューニングに疲れてしまったりといったことが想像されます。今回のアップデートではサービス・リージョンごとなど、様々なしきい値を設定できますので、役に立つのではと思います。 以下のようにコスト配分タグと「金額」「割合」を組み合わせることも出来ます。公式ドキュメントより。

{
  "source": ["aws.ce"],
  "detail-type": ["Anomaly Detected"],
  "detail": {
    "DimensionValue": ["ApplicationTeam:Frontend"],
    "MonitorName": ["dimensional-CAT-monitor"],
    "Impact": {
        "TotalImpact": [{ "numeric": [">", 100] }],
        "TotalImpactPercentage": [{ "numeric": [">", 10] }]
    },
    "RootCauses": {
        "exists": true,
        "Region": ["us-east-1"]
    }
  }
}

以下はEC2 サービスのみを検知する例です。

{
    "source": ["aws.ce"],
    "detail-type": ["Anomaly Detected"],
    "detail": {
        "DimensionValue": ["EC2"],
        "MonitorName": ["aws-services-monitor"]
    }
}

リンク

余談

八ヶ岳のほうに麓の町から走っていったら、標高 2,000m くらいで雪がありました。 だいぶ減ってきたので夏が近いなと思いました。

山本 哲也 (記事一覧)

カスタマーサクセス部のインフラエンジニア。

山を走るのが趣味です。