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 の標準。

主な機能

使うべきパターン

使わない方が良いパターン

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 の自前メトリクス公開に便利。