こんにちは🐱
カスタマーサクセス部の山本です。
最近は暑くて、ランニングしていたらセミの鳴き声の幻聴が聞こえました。
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"] } }
リンク
- AWS コスト異常検出は AWS ユーザー通知を通じて高度なアラートを可能にします
- AWS コスト異常検出の開始
- AWS ユーザー通知をコスト異常検出に使用する
- AWS コスト異常検出による異常な支出の検出
余談
八ヶ岳のほうに麓の町から走っていったら、標高 2,000m くらいで雪がありました。
だいぶ減ってきたので夏が近いなと思いました。