CloudWatchで監視を実装している環境に対して、夜間バッチ処理中はアラームを抑制することで、不要な通知を避けたいということはよくあることかと思います。
本記事では、CloudWatchのMetric Mathを活用して、特定の時間帯だけアラームを抑制する設定を行った実践例をご紹介します。
Metric Mathを採用した理由
まずはじめにCloudWatch監視における非監視設定の選択肢について考えました。
- 非監視時間に合わせてCloudWatchアラームを無効化/有効化する
- CloudWatch アラームとSNS トピックの間にLambda関数を仕込み、時間をチェックし非監視時間帯であれば通知を抑止するよう作りこむ
- MetricMath関数を使って、非監視時間帯のメトリクスを正常メトリクスとして上書きする
今回、非監視時間帯に本当に発生したアラートは、非監視時間帯明けに通知させたいという要件がありました。
CloudWatchではSNSやLambdaなど、アラートを検知した際に他サービスと連携することができますが、これはアラームの状態が遷移したことをトリガーにするため、非監視時間帯にアラート状態になったアラームは非監視時間帯が明けても通知されず、アラートに気づかないことがあるわけです。
監視明けのアラームの状態をチェックするにはまたLambda作りこみが必要となり、面倒くさい・・・。
MetricMath関数では、関数の通りにメトリクスの値を上書きできるイメージのため、非監視時間帯はわざと正常な値で上書き、非監視時間帯が明けたら実際の値を取得します。
非監視時間帯が明けたタイミングでアラーム状態に遷移してくれるので、楽に実装できそうとなり、MetricMath関数を使ってみることにしました。
Metric Mathとは?
CloudWatchのメトリクス(CPU使用率、ディスクI/O、リクエスト数など)に対して、加算・減算・乗算・除算・統計関数などを使って計算を行うことができます。
例えば、
- 複数のEC2インスタンスのCPU使用率の平均を出す
- リクエスト数とエラー数からエラー率を計算する
- カスタムメトリクスを組み合わせて複雑な条件でアラームを設定する
みたいなことができます。
よく使われる関数
関数 | 説明 |
---|---|
SUM([m1, m2]) |
メトリクスm1とm2の合計 |
AVG([m1, m2]) |
平均値 |
MAX([m1, m2]) |
最大値 |
MIN([m1, m2]) |
最小値 |
RATE(m1) |
単位時間あたりの変化率(カウンター系メトリクスに便利) |
IF(condition, value_if_true, value_if_false) |
条件分岐 |
やってみた
今回は特定の時間帯だけアラームを抑制したいので、タイムスタンプに基づいて値を返してくれる関数を利用します。
関数 | 説明 |
---|---|
MINUTE | 元の時系列の各タイムスタンプで UTC 分を表す、非スパース時系列 (0~59 の整数) を返します。 |
HOUR | 元の時系列の各タイムスタンプで UTC 時間を表す、非スパース時系列 (0~23 の整数) を返します。 |
DAY | 元の時系列の各タイムスタンプで UTC 曜日を表す、非スパース時系列 (1~7の整数) を返します。1 は月曜日を、7 は日曜日を表します。 |
DATE | 元の時系列の各タイムスタンプで UTC 日付を表す非スパース時系列 (1~31の整数) を返します。 |
今回は毎晩2:00~4:00の間アラームを抑制してみます。
タイムスタンプは UTC 基準のため、UTC17:00~19:00を関数で表現します。
HOUR(m1)
はメトリクスm1
のタイムスタンプの「時」を取得(UTC)13 <= HOUR < 17
の時間帯(17:00〜18:59)に該当する場合、値を10
に上書き- それ以外の時間帯は元のメトリクス
m1
の値を使用
MetricMath関数を使ったメトリクスとアラームを作成
- 対象のメトリクスを選択し「数式を追加」をクリックします。
- [すべての関数]-[IF]を選択。
- 追加されたメトリクスの[詳細]欄の編集マークをクリックし、設定したい関数を入力し、「適用」をクリック
IDやラベルは任意で設定してください。
- 作成したメトリクスの鈴マークをクリック
- お好みでアラーム設定
作成したメトリクスを確認してみます。
このメトリクスはTomcatのプロセス数を取得しており、本来の値は1が記録されています。
グラフから2:00~3:59は本来のメトリクス値でなく、一律10という値で記録されていることがわかります。
監視設定ではメトリクスが0になったらアラート状態になるよう設定しましたので、2:00~3:59の間はアラート状態にはなりません。
2:00~3:59にアラート状態になった場合も、2:00~3:59ではなく非監視時間帯が明けた4時に通知されました。
※非監視時間内に正常に戻った場合は通知されません。
さいごに
Lambda等その他のサービスを使うことなく、非監視設定できたのは大変ありがたいです。
Lambdaの管理も必要なく運用負担も軽減できる点も嬉しいですね。