CloudWatch — Logs / Metrics / Alarms
概要
Amazon CloudWatch は AWS の標準モニタリング基盤。Logs(ログ集約)・Metrics(数値時系列)・Alarms(閾値通知)の 3 本柱で、AWS リソースの「壊れたら気付ける」基盤を提供します。 Lambda / API Gateway / EC2 / RDS など主要サービスは標準で CloudWatch にログ・メトリクスを送ってくれます。
設定不足で「エラーが起きてるのに気付かない」状況を作ると痛い目に遭います。最低限 Lambda Errors / Duration p95 / API GW 5xx に Alarm を仕込むのが iigtn-platform の標準。
主な機能
- Log Group / Log Stream — ログの論理単位。Group ごとに retention(保持期間)を設定。デフォルトは無期限なので必ず設定。
- Logs Insights — SQL 風のクエリ言語で大量ログを集計・抽出。
- Live Tail — Console /
aws logs tail --followでリアルタイム追跡。 - Metric — 数値時系列。Namespace + Dimensions + Statistic + Period で集約。
- Alarm — 閾値超過を検知して SNS に通知。OK / ALARM / INSUFFICIENT_DATA の 3 状態。
- Composite Alarm — 複数 Alarm を AND/OR で合成。ノイズ削減。
- MetricMath —
m1 / m2 * 100で派生メトリクス(エラー率等)。 - Dashboard — Widget を JSON で定義、Terraform 化可能。
- EMF (Embedded Metric Format) — JSON ログを書くだけで CloudWatch Metrics に変換される標準仕様。
- Container / Lambda Insights — 追加エージェントで CPU / メモリ / 詳細を収集。
使うべきパターン
- AWS マネージドサービスの監視 — Lambda Errors / Duration / Throttles、API GW 5xx、ALB 4xx/5xx、DynamoDB throttles 等。
- アプリログの集約 — Lambda 標準出力、ECS awslogs ドライバ、EC2 CloudWatch Agent。
- SLI / SLO 管理 — Alarm + Composite で sla 達成率を可視化。
- コストアラート — Budgets と組み合わせる(次記事で詳細)。
使わない方が良いパターン
- 大量メトリクスの長期保管 — 15 ヶ月で自動消滅、それより長く要るなら Prometheus + S3 等を検討。
- 本格的な APM — Datadog / New Relic / Grafana Cloud の方が分析機能が豊富。
- ログ全文検索が頻繁 — OpenSearch / Athena の方がコスパ良いことも。
Terraform 最小サンプル(Lambda 監視一式)
# Log Group (retention 必須)
resource "aws_cloudwatch_log_group" "fn" {
name = "/aws/lambda/myfn"
retention_in_days = 14
}
# Lambda Errors アラーム
resource "aws_cloudwatch_metric_alarm" "fn_errors" {
alarm_name = "myfn-errors"
alarm_description = "Lambda errors over 1 in 5min"
namespace = "AWS/Lambda"
metric_name = "Errors"
dimensions = { FunctionName = aws_lambda_function.fn.function_name }
statistic = "Sum"
period = 300
evaluation_periods = 1
threshold = 1
comparison_operator = "GreaterThanOrEqualToThreshold"
treat_missing_data = "notBreaching"
alarm_actions = [aws_sns_topic.alerts.arn]
}
# Duration p95 アラーム
resource "aws_cloudwatch_metric_alarm" "fn_duration" {
alarm_name = "myfn-duration-p95"
metric_name = "Duration"
namespace = "AWS/Lambda"
dimensions = { FunctionName = aws_lambda_function.fn.function_name }
extended_statistic = "p95"
period = 300
evaluation_periods = 2
threshold = 3000 # 3 秒以上
comparison_operator = "GreaterThanThreshold"
alarm_actions = [aws_sns_topic.alerts.arn]
}
# Logs Insights クエリ (Dashboard で使う)
# fields @timestamp, @message
# | filter @message like /ERROR/
# | sort @timestamp desc
# | limit 100
Logs Insights クエリ実用例
# Lambda 所要時間を 5 分集計
filter @type = "REPORT"
| stats avg(@duration), max(@duration), pct(@duration, 95) by bin(5m)
# HTTP 5xx URL ランキング
filter @message like /\"status\":5/
| parse @message /"path":"(?<p>[^"]*)"/
| stats count(*) as cnt by p
| sort cnt desc | limit 20
# Memory 80% 超え呼び出し
filter @type = "REPORT"
| filter @maxMemoryUsed / @memorySize > 0.8
| display @timestamp, @memorySize, @maxMemoryUsed
用語集
- Log Group / Log Stream
- Group = 論理ログ束 (retention・暗号化単位)。Stream = 1 ファイル相当。
- Retention
- ログ保持期間。デフォルトは無期限なので必ず設定。1〜3653 日 + 永続。
- Logs Insights
- SQL 風クエリ言語。fields / filter / parse / stats / sort / limit。
- Namespace / Dimension
- Namespace = メトリクス分類 (AWS/Lambda 等)。Dimension = キーラベル (FunctionName=myfn 等)。
- Statistic / Period
- Sum / Avg / Min / Max / pNN。Period = 集約区間 (秒)。
- MetricMath
m1 / m2 * 100等の数式で派生メトリクスを定義する機能。- Alarm 状態
- OK (閾値以下) / ALARM (超過) / INSUFFICIENT_DATA (データ不足)。
- treat-missing-data
- データなしの時の Alarm 状態。notBreaching / breaching / missing / ignore。
- Composite Alarm
- 複数 Alarm を AND/OR で組合わせた合成。ノイズ削減に有効。
- EMF (Embedded Metric Format)
- JSON ログを書くだけで CloudWatch Metrics に変換される仕様。Lambda の自前メトリクス公開に便利。