SJ blog
devops
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

CloudWatchアラームと異常検出 — Composite Alarm・Auto Scaling連携・OKアクション

CloudWatchアラームの状態(OK/ALARM/INSUFFICIENT_DATA)、複合アラーム(Composite Alarm)、機械学習ベースの異常検出アラーム、Auto Scalingポリシーとの連携、Datapointsを解説。

一言結論

Composite AlarmとM of N評価(DatapointsToAlarm)を組み合わせることでアラームノイズを大幅に減らせるため、個別メトリクスのアラームはComposite Alarmの入力として使い、通知はComposite Alarmにのみ設定するのが実運用の基本設計だ。

CloudWatchアラームの基本

CloudWatchアラームはメトリクスの値を監視し、閾値を超えた場合にアクションを実行する。

3つの状態:
  OK:                 メトリクスが正常範囲内
  ALARM:              メトリクスが閾値を超えた
  INSUFFICIENT_DATA:  データポイントが不足(起動直後など)

アクションのトリガータイミング:
  状態が変化したとき(OK→ALARM, ALARM→OK等)に実行

アラームの設定

# EC2のCPU使用率が80%超で5分間継続したらSNS通知
aws cloudwatch put-metric-alarm \
  --alarm-name high-cpu-usage \
  --alarm-description "CPU utilization exceeded 80%" \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=InstanceId,Value=i-xxx \
  --statistic Average \
  --period 300 \
  --evaluation-periods 2 \
  --datapoints-to-alarm 2 \
  --threshold 80 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:alerts \
  --ok-actions arn:aws:sns:ap-northeast-1:123456789012:alerts \
  --treat-missing-data missing

Datapointsオプション(M of N評価)

--evaluation-periods N --datapoints-to-alarm M でN期間中M期間が閾値超えでALARMになる。

例: evaluation-periods=5, datapoints-to-alarm=3
  → 5分間のうち3分間が閾値超えでALARM

これにより:
  スパイク的な一時的超過をALARMにしない
  持続的な問題のみアラームにできる

treat-missing-data オプション:
  missing:       デフォルト(不足データをInadequate扱い)
  notBreaching:  閾値を超えていないとみなす(非アラーム)
  breaching:     閾値を超えているとみなす(アラーム)
  ignore:        現在の状態を維持

Composite Alarm(複合アラーム)

複数のアラームを AND/OR 条件で組み合わせる。アラームノイズを削減し、より意味のある状態変化だけを通知できる。

# DB接続エラーかつCPUが高い場合のみアラート
aws cloudwatch put-composite-alarm \
  --alarm-name db-connection-and-high-cpu \
  --alarm-rule "ALARM(\"db-connection-error\") AND ALARM(\"high-cpu-usage\")"

# いずれかの異常でアラート
aws cloudwatch put-composite-alarm \
  --alarm-name any-critical-issue \
  --alarm-rule "ALARM(\"db-connection-error\") OR ALARM(\"high-cpu-usage\") OR ALARM(\"memory-low\")"

Composite Alarmの利点:

  • 個別アラームからのノイズを削減(各アラームは通知しない)
  • 「このシステムに本当に問題があるか」を組み合わせ判断

異常検出アラーム(Anomaly Detection)

機械学習を使って「通常のパターン」を自動学習し、外れ値を検出する。

# 異常検出モデルの作成
aws cloudwatch put-anomaly-detector \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=InstanceId,Value=i-xxx \
  --stat Average

# 異常検出ベースのアラーム
aws cloudwatch put-metric-alarm \
  --alarm-name anomaly-cpu \
  --metrics '[{
    "Id": "m1",
    "MetricStat": {
      "Metric": {
        "Namespace": "AWS/EC2",
        "MetricName": "CPUUtilization",
        "Dimensions": [{"Name": "InstanceId", "Value": "i-xxx"}]
      },
      "Period": 300,
      "Stat": "Average"
    }
  },{
    "Id": "ad1",
    "Expression": "ANOMALY_DETECTION_BAND(m1, 2)"
  }]' \
  --comparison-operator GreaterThanUpperThreshold \
  --threshold-metric-id ad1

Auto Scalingポリシーとの連携

# CPU高でスケールアウト
aws cloudwatch put-metric-alarm \
  --alarm-name scale-out-alarm \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=AutoScalingGroupName,Value=my-asg \
  --statistic Average \
  --period 60 \
  --evaluation-periods 3 \
  --threshold 70 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:autoscaling:ap-northeast-1:123456789012:scalingPolicy:xxx

# CPU低でスケールイン
aws cloudwatch put-metric-alarm \
  --alarm-name scale-in-alarm \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=AutoScalingGroupName,Value=my-asg \
  --statistic Average \
  --period 300 \
  --evaluation-periods 5 \
  --threshold 30 \
  --comparison-operator LessThanThreshold \
  --alarm-actions arn:aws:autoscaling:ap-northeast-1:123456789012:scalingPolicy:yyy

カスタムメトリクスとアラーム

# アプリケーションからカスタムメトリクスを送信
import boto3

cloudwatch = boto3.client('cloudwatch')

# キューの深さを送信
cloudwatch.put_metric_data(
    Namespace='MyApp',
    MetricData=[{
        'MetricName': 'QueueDepth',
        'Value': get_queue_depth(),
        'Unit': 'Count',
        'Dimensions': [
            {'Name': 'Environment', 'Value': 'Production'},
            {'Name': 'QueueName', 'Value': 'order-processing'}
        ]
    }]
)
# カスタムメトリクスへのアラーム設定
aws cloudwatch put-metric-alarm \
  --alarm-name high-queue-depth \
  --namespace MyApp \
  --metric-name QueueDepth \
  --dimensions Name=Environment,Value=Production \
  --statistic Maximum \
  --period 60 \
  --threshold 1000 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:...

試験頻出ポイント

シナリオ回答
複数の条件がすべて満たされた時だけアラートComposite Alarm(AND条件)
一時的スパイクを無視して継続的な問題のみDatapoints to Alarm (M of N)
メトリクスがない時のアラームの状態INSUFFICIENT_DATA
時間帯別の正常値に基づいてアラーム異常検出アラーム(Anomaly Detection)
アラームがOKに戻ったときも通知ok-actions を設定

まとめ

CloudWatchアラームは単純な閾値監視から、複合条件、機械学習ベースの異常検出まで柔軟に設定できる。Composite AlarmでノイズをReduceし、M of N評価でスパイク誤報を防ぐことが実運用での重要なテクニックだ。