Amazon CloudWatch AlarmのEvaluationPeriodsとDatapointsToAlarmパラメーターを理解する
はじめに
先日CloudWatch Alarmの機能を使ってEC2インスタンスのCPU使用率を監視し、異常を検知した際にSNSを使用してEメール送信するという機能をCDKで実装するという記事を書きました。
その際のCloudWatch Alarmの設定において、EvaluationPeriods
とDatapointsToAlarm
というパラメーターを使用して実装しました。
そこで今回は、この二つのパラメーターを設定するとどのような挙動をするのかという説明と検証、そしてその活用法についてまとめてみました。
3行まとめ
EvaluationPeriods
とDatapointsToAlarm
とは、特定の期間の一定の異常を検知したい場合に有効である。- クリティカルな異常を即時に検知したい場合は
EvaluationPeriods
とDatapointsToAlarm
を同じ値に設定する。 - アプリケーションの規模と要件に応じてデータポイントの割合を適切に決定する必要がある。
CloudWatch Alarmとは
CloudWatch Alarmは、Amazon CloudWatchの機能の一つで、特定のメトリクスが設定した閾値を超えた場合にアラームを発生させることができます。
これにより、システムの異常を迅速に検知し、適切な対応を取ることができます。
参考:Amazon CloudWatch でのアラームの使用
EvaluationPeriodsとDatapointsToAlarmとは
EvaluationPeriods
とDatapointsToAlarm
について、公式ドキュメントによると
EvaluationPeriods
データを指定されたしきい値と比較する期間の数。アラームをトリガーするために、連続したデータポイント数が違反であることを要求するアラームを設定している場合、この値はその数を指定する。M out of N" アラームを設定する場合、この値は N で、
DatapointsToAlarm
は M である。(DeepL翻訳)
DatapointsToAlarm
アラームをトリガーするために必要なデータポイントの数。これは「M out of N」アラームを設定する場合にのみ使用する。その場合、この値が M であり、
EvaluationPeriods
に設定した値が N となる。(DeepL翻訳)
とのことです。
EvaluationPeriods
はアラームが評価される期間の数であり、DatapointsToAlarm
はアラームが発報されるために必要なデータポイントの数です。
つまり、EvaluationPeriod
の数のうちDatapointsToAlarm
の数において異常が検出されたら、Alarmが発報されるということです。公式ドキュメントに書いてある「M out of N」のうち、Mに当たるのがDatapointsToAlarm
で、Nに当たるのがEvaluationPeriods
です。
1つのデータポイントは1つの期間(Period)に対応するため、アラーム判定の実際の評価期間は、Period
の長さとEvaluationPeriods
の積となります。
例えば、EvaluationPeriods
を10、DatapointsToAlarm
を5と設定します。そして1回のPeriod
期間を3分とすると、30分間(3 * 10)の評価のうち、15分間(3 * 5)で異常が検出された場合、Alarmが発報されます。
イメージとしては、以下のようなイメージです。
検証
今回は、特定のEC2のCPU使用率を監視します。閾値を50%と設定し、Period
を1分、EvaluationPeriods
を10、DatapointsToAlarm
を3としてCloudWatch Alarmを設定し、その挙動を確認します。
$ aws cloudwatch describe-alarms --alarm-names testAlarm // 省略 { "MetricAlarms": [ { // ... "AlarmName": "testAlarm", "StateValue": "OK", "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Statistic": "Average", "Dimensions": [ { "Name": "InstanceId", "Value": "i-xxxxxxxxxxxxxxxxxxx" } ], "Period": 60, "EvaluationPeriods": 10, "DatapointsToAlarm": 3, "Threshold": 50.0, // ... } ], }
stressコマンドで、EC2インスタンスに負荷をかけます。
stress --cpu 8 --timeout 300
以下は、10:34から負荷をかけ、5分後の39分時点のグラフです。
10:37に閾値を超えています。しかし、39分時点ではまだステータスはOKの状態です。これはDatapointsToAlarm
を3に設定している為、2ポイント分のデータポイントにおいては閾値を超えていたとしてもAlarm状態にはならないことを表しています。
そして、以下のグラフは負荷開始から10分後のグラフです。
閾値が超えているデータポイントが3以上になったので、Alarmステータスになっていることが確認できました。
活用方法
これらのパラメーターを実際どのように設定するかを考えていきます。
実際のアプリケーションにおいてこれらのパラメーターを適切に設定することができると、システムの監視精度を高め、誤検知を減らすことができます。以下に3つの設定パターンを提示します。
1. 短期間の異常検知
EvaluationPeriods
とDatapointsToAlarm
を同じ値に設定することで、短期間でクリティカルな異常を検知することができます。例えば、EvaluationPeriods
を3、DatapointsToAlarm
も3に設定すると、3回連続で異常が発生した場合にアラームが発報され、即座に対応が必要な状況を迅速にキャッチすることができます。
2. 一時的な異常の無視
一時的な異常を無視したい場合は、EvaluationPeriods
を多めに設定し、DatapointsToAlarm
を少なめに設定します。例えば、EvaluationPeriods
を10、DatapointsToAlarm
を3に設定すると、10回の評価期間のうち、2回以下の異常程度であれば無視することができます。具体的な例として、特定の処理によって一時的にシステムが重くなることがあるが、全体としては正常に動いてるシステムがあります。それがある程度許容できるのであればこのようなパラメーター設定でも良いかもしれません。また、この設定により短期間の一時的な異常による誤検知も防ぐことができます。
3. 持続的な異常の検出
逆に、持続的な異常を検出したい場合は、EvaluationPeriods
を多めに設定し、DatapointsToAlarm
もそれに応じて設定します。例えば、EvaluationPeriods
を10、DatapointsToAlarm
を8に設定すると、12回の評価期間のうち8回以上異常が検出された場合にアラームが発報されます。これにより、システムの持続的な問題を検出することができます。
これらのパラメーターの設定は、実際のアプリケーションの規模や要件によって柔軟に設定する必要があります。
まとめ
CloudWatch AlarmのEvaluationPeriods
とDatapointsToAlarm
パラメータを各アプリケーションの要件に応じて適切に設定することで、システムの監視精度を高め、適切なタイミングでの対応を可能になります。
参考になりましたら幸いです。
参考
- CloudWatch Alarmの条件(しきい値、評価期間)を変更した時のアラーム状態の変更のされ方を確認してみた
- 【AWS】用語を整理しながら学ぶAWS - CloudWatchアラーム 監視編 part1
- Amazon CloudWatch でのアラームの使用
- AWS::CloudWatch::Alarm