CloudWatch アラームで、アラーム状態から評価期間が過ぎてもすぐにOK状態に戻りません。原因と対処法を教えてください

この動作は CloudWatch アラームの仕様です。監視対象のメトリクスに数式を適用することで回避できます。
2022.09.09

困っていた内容

エラー発生時にのみ記録されるメトリクスを監視対象として CloudWatch アラームを構成しています。
エラーのメトリクスが発生してアラーム状態に遷移したあと、設定した評価期間(1分、5分 etc)を経過すると OK 状態に戻ると想定していましたが、すぐには OK 状態に戻らず数分間のラグが生じます。
この理由と対処法を教えてください。

どう対応すればいいの?

原因について

これには CloudWatch アラームの仕様と、監視対象メトリクスのタイプが関係しています。

上記例のように「エラー時にのみ記録される」タイプのメトリクスでは、メトリクスが発生していない部分はデータの欠落として扱われます。
そのため下記の「データ欠落時の延伸動作」が働き、すぐには OK 状態に戻らないのです。

【AWSドキュメント】データが欠落した場合のアラーム状態の評価方法 からの抜粋:

アラームが状態を変更するかどうかを評価するたびに、CloudWatch は [Evaluation Periods (評価期間)] に指定されている数よりも多くのデータポイントを取得しようとします。

対処方法について

残念ながら「データ欠落時の延伸動作」そのものを変更したり無効化することはできません。
ただし回避策として、監視対象のメトリクスに数式を適用し、その数式をアラームの監視対象とする方法があります。

具体的には、FILL 関数を適用することでデータポイントの欠落部分を明示的に 0 として補完できるため、前述の「データ欠落時の延伸動作」を回避できるのです。
設定手順は以下になります。

設定手順

  1. CloudWatch アラームのメトリクス選択画面で対象のメトリクスを選択し「数式を追加 > すべての関数 > FILL」を順にクリックします。

  2. 追加された数式の編集をクリックし「FILL(m1,0)」と入力します。
    ※ "m1" の箇所は環境により異りますので、目的のメトリクスに応じて置き換えてください。

  3. メトリクスではなく数式の方を選択した状態で「メトリクスの追加」をクリックします。

以上の手順で「データ欠落時の延伸動作」を回避し「評価期間が過ぎるとすぐに OK 状態に戻る」アラームを設定することができます。


試してみた

文章では分かりづらいと思いますので、実際にどのような挙動になるか検証してみました。

検証内容

評価期間 1 分でメトリクスを監視する CloudWatch アラームを作成し、監視対象のエラーメトリクスを 5 分間隔で 2 回発生させる。
( 1 回目:8時30分 / 2 回目:8時35分 )

期待する動作

1 回目のエラー発生後にアラーム状態に遷移する。
評価期間の 1 分を過ぎると一度 OK 状態に戻り、2 回目のエラー発生後に再びアラーム状態となる。


上記の検証を行い、CloudWatch アラームの監視対象を「1. メトリクスにした場合」と「2. 数式にした場合」とで、アラームの動作にどのような違いが出るか確認してみました。


1. メトリクスを監視した場合のアラームの動作

1 回目発生後(8時31分)にアラーム状態に遷移したまま 1 分経っても OK 状態に戻ることなく、11 分後(8時42分)にようやく OK 状態に戻っています。期待した動作となっていません。


2. 数式を監視した場合のアラームの動作

1 回目発生後(8時31分)の 1 分後にはきちんと OK 状態に戻り、2 回目発生後(8時36分)に再びアラーム状態になっています。期待した通りの動作です。

補足

検証を行った時のメトリクスのグラフを見ると、上記の動作となった理由が一目瞭然です。

元のメトリクス(オレンジの線)は前述の「データ欠落時の延伸動作」により 1 回目と 2 回目の間にデータポイントが追加され、 5 分間ずっとエラーが発生していたかのような値になっています。このためアラーム状態のまま OK 状態に戻らなかったことがよく分かります。

それに対して数式(青の線)の方は、メトリクスが発生した時刻以外はきちんと 0 になっているため、期待した通りの動作(アラーム発生から 1 分後に OK 状態に戻る)となったことが分かります。

以上、「評価期間を過ぎるとすぐに OK 状態に戻る CloudWatch アラーム」の設定方法をご紹介しました。

本記事の対応が必要となるケースとしては、アプリケーションのログを CloudWatch Logs に出力しており、エラーが発生した時にメトリクスフィルタでカスタムメトリクスを発行して CloudWatch アラームを発報する、という構成にしている場合が考えられます。この情報がどなたかのお役に立てば幸いです!

参考資料

データが欠落した場合のアラーム状態の評価方法 - Amazon CloudWatch
Metric Math を使用する - Amazon CloudWatch