Dev Study
AWSサービスの内部原理 コース

69. アラームは3状態の状態機械である — M out of N評価と欠落データの4つの流儀

CloudWatchアラームがどうやって「鳴る/鳴らない」を決めているのか——状態の遷移、N個中M個の数え方、そしてデータが来なかったときの4つの流儀を、上から下へ図で追っていきます。

① アラームは常に3状態のどれか

新データ到着評価のたびに状態を計算
OK閾値内
無色
ALARM閾値超過
判断不能INSUFFICIENT_DATA
灰色
  • 「Similar to how each alarm is always in one of three states」——アラームは常にこの3状態のいずれか
  • ダッシュボード上ではOK=無色、ALARM=赤、INSUFFICIENT_DATA=灰色で表示される

アラームは「壊れているか/いないか」の2値ではなく、「判断できない(INSUFFICIENT_DATA)」を含む3状態の有限状態機械(FSM)である。状態×入力→次状態という遷移表がこの図の正体。

② アクションは状態変化の瞬間だけ

毎回の評価新しい状態を計算
変化した瞬間だけ
変化なし例: ALARMのまま
何もしない
状態が変化例: OK→ALARM
唯一の例外
アクション発火SNS通知 / EC2 / Auto Scaling
Auto Scaling新状態に留まる限り毎分再発火
SNS・EC2は遷移時のみ
  • 「An alarm invokes actions only when the alarm changes state.」——アクションは状態変化時のみ
  • 「The exception is for alarms with Auto Scaling actions. For Auto Scaling actions, the alarm continues to invoke the action once per minute that the alarm remains in the new state.」——Auto Scalingアクションのみ、新状態に留まる限り毎分再発火
  • アクション先はSNSトピック通知/EC2アクション/Auto Scalingアクションなど

状態が同じままなら何もしない、変わった瞬間だけ動く——これがエッジトリガの発想。ALARM→SNSトピックへの通知は、メッセージング編で見たpub/subの購読者へファンアウトする現場そのもの。

③ 評価の3つのつまみ: period × N × M

period(期間)1点を集計する時間幅
例: 5分→5分ごとに1点
そのうち
N: 評価期間数evaluation periods = 直近N点を見る
例: N=3
M < N なら "M out of N" アラーム
M: 発報点数datapoints to alarm = M個超過でALARM
例: M=2
0 X 0超過1個 < M=2 → 鳴らない
スパイクを無視
0 X X超過2個 = M=2 → ALARM
  • ドキュメントの例そのまま——「Datapoints to Alarm is only 2 while Evaluation Periods is 3. This is a 2 out of 3, M out of N alarm.」
  • 評価期間には上限がある: periodが1時間(3600秒)以上なら最大7日分、それ未満なら最大1日分(period × evaluation periods で計算)

M=N=1なら「1回でも跨いだら即ALARM」の敏感なアラーム。M<Nにすると「N回中M回」を要求し、瞬間的なスパイク1発では鳴らなくなる。これがヒステリシス(チャタリング防止)——閾値を1度跨いだだけでは反応させない制御工学の基礎の実装。

④ 欠落データの扱いは4択

非超過 = 0閾値内
超過 = X閾値違反
欠落 = -データ無し
notBreaching「良い(閾値内)」とみなす
breaching「悪い(閾値違反)」とみなす
ignore現在の状態を維持
missing全欠落ならINSUFFICIENT_DATA
★デフォルト
  • 4択と各挙動は原文通り——「notBreaching – Missing data points are treated as "good"」「breaching – ... treated as "bad"」「ignore – The current alarm state is maintained」「missing – If all data points in the alarm evaluation range are missing, the alarm transitions to INSUFFICIENT_DATA.」
  • 「The default behavior is missing.」——デフォルトは missing
  • AWS/DynamoDB名前空間のメトリクスは例外的にデフォルトが ignore(欠落時は現状維持)

欠落は「良い」とも「悪い」とも決めつけられない——だから利用者が意味を与える。データポイントもアラームと同じ3分類(非超過/超過/欠落)なのが対称的。

⑤ 選び方: 途絶=異常か、無音=正常か

欠落データメトリクスの性質で意味が逆転する
選ぶ設定
常時流れる系例: リクエスト数・CPU
途絶=サーバ停止・接続断=異常
エラー時のみ系例: DynamoDB ThrottledRequests
無音=エラーゼロ=正常
breaching欠落を「悪い」とみなす
notBreaching欠落を「良い」とみなす
  • 原文の例そのまま——「a metric that continually reports data, you might want to treat missing data points as breaching」
  • 「a metric that generates data points only when an error occurs, such as ThrottledRequests in Amazon DynamoDB, you would want to treat missing data as notBreaching」
  • EC2の停止/終了/再起動/復旧アクションを持つアラームは、欠落を missing にしてALARM時のみ発火する構成が推奨される

同じ「データが来ない」でも、メトリクスによって「異常」にも「正常」にも解釈が真逆になる。DynamoDB編で見たThrottledRequests(スロットリング)が、ここでは「普段は無音であるべきメトリクス」の代表例として再登場する。

⑥ 欠落設定は「最後の手段」

評価レンジ取得N個ではなくN+α個を多めに取りに行く
例: N=3・M=3→直近5点
さらに
欠落ゼロ最新N点で評価
欠落設定は不要
実データN個以上古い実データも動員して評価
欠落設定は不要
実データN個未満足りない分だけ欠落設定で穴埋め
ここで初めて使う
早すぎる遷移回避[- - - - X] や [- - - X -] では即ALARMしない(M=3の場合)
次が非超過かもしれない
  • 「CloudWatch attempts to retrieve a higher number of data points than the number specified as Evaluation Periods. ... The time frame ... is the evaluation range.」
  • 実データが足りるなら「the value you set for how to treat missing data is not needed and is ignored.」——欠落設定を使うのは実データがN個に満たないときだけ
  • 「多めに取る」動作はデフォルトのスライディング評価ウィンドウの場合で、ウォールクロック評価ウィンドウでは period × evaluation periods ちょうどの点だけを取得する
  • アラーム履歴は30日保持
  • 複数アラームを束ねる複合アラーム(composite alarm)はルール式内の全条件が満たされたときだけALARMになり、状態変化時にSNS通知を送れるが、EC2アクション/Auto Scalingアクションは実行できない

欠落設定(notBreaching等)は常に効くわけではない——CloudWatchはまず実データをかき集め、それでも足りないときの穴埋めにだけ使う。だから「常時データが流れるメトリクス」では欠落設定がほとんど出番を持たない。複合アラームを使えば、複数のノイズの多いアラームを1つに束ねて、通知先を1本に絞れる。

公式ドキュメントで詳しく ↗