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評価でスパイク誤報を防ぐことが実運用での重要なテクニックだ。