CloudWatch + CloudWatch Logs — 40+ コマンドを 6 カテゴリで

AWS の標準モニタリング基盤。Logs(ログ集約)と Metrics(数値時系列)と Alarms(閾値通知)の 3 つを CLI で操作。 Console で迷子になりがちな絞り込みも、CLI なら 1 行で済むことが多いです。

目次

  1. Logs グループ・ストリーム
  2. ログ tail / filter
  3. Logs Insights (クエリ言語)
  4. Metrics 取得
  5. Alarms 作成・管理
  6. Dashboard / 出力先 (SNS)
  7. 運用レシピ
  8. 用語集

1. Logs グループ・ストリーム

# Group 一覧
aws logs describe-log-groups
aws logs describe-log-groups --log-group-name-prefix '/aws/lambda/'

# Group 作成 / 削除
aws logs create-log-group --log-group-name /myapp
aws logs delete-log-group --log-group-name /myapp

# 保持期間(デフォルトは無期限 = コスト垂れ流し)
aws logs put-retention-policy --log-group-name /myapp --retention-in-days 30
aws logs put-retention-policy --log-group-name /aws/lambda/myfn --retention-in-days 14

# Stream 一覧
aws logs describe-log-streams --log-group-name /aws/lambda/myfn \
  --order-by LastEventTime --descending --max-items 5
Lambda は初回実行で勝手に Log Group を作るが retention 無期限がデフォルト。Terraform で 14d / 30d を必ず設定。

2. ログ tail / filter

# tail (Console の Live Tail に近い)
aws logs tail /aws/lambda/myfn --follow
aws logs tail /aws/lambda/myfn --since 30m
aws logs tail /aws/lambda/myfn --filter-pattern 'ERROR'
aws logs tail /aws/lambda/myfn --format short
aws logs tail /aws/lambda/myfn --log-stream-name-prefix '2026/04/26/'

# filter-log-events (より細かいフィルタ)
aws logs filter-log-events --log-group-name /aws/lambda/myfn \
  --filter-pattern 'ERROR' \
  --start-time $(date -d '1 hour ago' +%s)000

# 構造化ログを JSON フィルタ
aws logs filter-log-events --log-group-name /aws/lambda/myfn \
  --filter-pattern '{ $.level = "error" && $.statusCode >= 500 }' \
  --max-items 100

# 前後の文脈を見る(複数 stream をまたぐ)
aws logs get-log-events --log-group-name /aws/lambda/myfn \
  --log-stream-name '2026/04/26/[$LATEST]xxx' \
  --limit 100 --start-from-head

# ログをローカルに落とす
aws logs filter-log-events --log-group-name /aws/lambda/myfn \
  --start-time $(date -d '1 day ago' +%s)000 \
  --query 'events[].message' --output text \
  > lambda.log

3. Logs Insights (クエリ言語)

# 非同期クエリ実行(QueryId を取得 → 後で結果取得)
QID=$(aws logs start-query \
  --log-group-name /aws/lambda/myfn \
  --start-time $(date -d '1 hour ago' +%s) \
  --end-time $(date +%s) \
  --query-string 'fields @timestamp, @message | sort @timestamp desc | limit 50' \
  --query 'queryId' --output text)

# 結果取得(Status: Running → Complete)
aws logs get-query-results --query-id $QID

# よく使うクエリパターン:

# (1) ERROR を時系列で
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 100

# (2) Lambda の所要時間を 5 分集計
filter @type = "REPORT"
| stats avg(@duration), max(@duration), pct(@duration, 95) by bin(5m)

# (3) HTTP ステータス別カウント
filter @message like /\"status\":/
| parse @message /"status":(?<st>\d+)/
| stats count(*) by st

# (4) 5xx URL ランキング
filter @message like /\"status\":5/
| parse @message /"path":"(?<p>[^"]*)"/
| stats count(*) as cnt by p
| sort cnt desc | limit 20

# (5) Memory used が設定の 80% を超えた呼び出し
filter @type = "REPORT"
| filter @maxMemoryUsed / @memorySize > 0.8
| display @timestamp, @memorySize, @maxMemoryUsed

4. Metrics 取得

# Namespace / Metric 一覧
aws cloudwatch list-metrics --namespace AWS/Lambda
aws cloudwatch list-metrics --namespace AWS/Lambda \
  --dimensions Name=FunctionName,Value=myfn

# 単発取得(古い API)
aws cloudwatch get-metric-statistics \
  --namespace AWS/Lambda --metric-name Errors \
  --dimensions Name=FunctionName,Value=myfn \
  --start-time 2026-04-25T00:00:00Z --end-time 2026-04-26T00:00:00Z \
  --period 3600 --statistics Sum

# 推奨: get-metric-data(複数メトリクス並列)
cat > query.json << 'EOF'
[
  {
    "Id":"err",
    "MetricStat":{
      "Metric":{
        "Namespace":"AWS/Lambda","MetricName":"Errors",
        "Dimensions":[{"Name":"FunctionName","Value":"myfn"}]
      },
      "Period":300, "Stat":"Sum"
    }
  },
  {
    "Id":"dur",
    "MetricStat":{
      "Metric":{
        "Namespace":"AWS/Lambda","MetricName":"Duration",
        "Dimensions":[{"Name":"FunctionName","Value":"myfn"}]
      },
      "Period":300, "Stat":"Average"
    }
  }
]
EOF
aws cloudwatch get-metric-data \
  --metric-data-queries file://query.json \
  --start-time 2026-04-26T00:00:00Z --end-time 2026-04-26T01:00:00Z

# カスタムメトリクスを送る
aws cloudwatch put-metric-data --namespace MyApp \
  --metric-name SignupCount --value 1 --unit Count \
  --dimensions Env=prod

5. Alarms 作成・管理

# Alarm 一覧
aws cloudwatch describe-alarms
aws cloudwatch describe-alarms --state-value ALARM
aws cloudwatch describe-alarms --alarm-name-prefix 'myfn-'

# Lambda Errors アラーム
aws cloudwatch put-metric-alarm \
  --alarm-name myfn-errors \
  --alarm-description 'Lambda errors over 1 in 5min' \
  --namespace AWS/Lambda --metric-name Errors \
  --dimensions Name=FunctionName,Value=myfn \
  --statistic Sum --period 300 --evaluation-periods 1 \
  --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold \
  --treat-missing-data notBreaching \
  --alarm-actions arn:aws:sns:ap-northeast-1:xxx:alerts

# Duration p95 アラーム(メトリクス数式)
aws cloudwatch put-metric-alarm \
  --alarm-name myfn-duration-p95 \
  --metrics file://metric-math.json \
  --evaluation-periods 2 --threshold 3000 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:...

# 一時停止 / 再開
aws cloudwatch disable-alarm-actions --alarm-names myfn-errors
aws cloudwatch enable-alarm-actions --alarm-names myfn-errors

# 削除
aws cloudwatch delete-alarms --alarm-names myfn-errors

# Alarm の履歴
aws cloudwatch describe-alarm-history --alarm-name myfn-errors --max-items 10

6. Dashboard / 出力先 (SNS)

# Dashboard 一覧
aws cloudwatch list-dashboards
aws cloudwatch get-dashboard --dashboard-name my-dashboard
aws cloudwatch put-dashboard --dashboard-name my-dashboard --dashboard-body file://dashboard.json
aws cloudwatch delete-dashboards --dashboard-names my-dashboard

# SNS Topic 作成 + Email サブスクライブ
aws sns create-topic --name alerts
aws sns subscribe --topic-arn arn:... --protocol email --notification-endpoint contact@iigtn.com
aws sns list-subscriptions-by-topic --topic-arn arn:...
aws sns publish --topic-arn arn:... --message 'test alert' --subject 'CW test'

運用レシピ

レシピ 1 — Lambda の直近 1 時間のエラー集計

aws cloudwatch get-metric-statistics \
  --namespace AWS/Lambda --metric-name Errors \
  --dimensions Name=FunctionName,Value=myfn \
  --start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 60 --statistics Sum \
  --query 'Datapoints | sort_by(@, &Timestamp)' --output table

レシピ 2 — 全 Lambda の log retention を 14 日に統一

for fn in $(aws lambda list-functions --query 'Functions[].FunctionName' --output text); do
  aws logs put-retention-policy --log-group-name "/aws/lambda/$fn" --retention-in-days 14
done

レシピ 3 — Logs Insights をシェルから 1 発で叩く(同期化)

QID=$(aws logs start-query \
  --log-group-name /aws/lambda/myfn \
  --start-time $(date -d '1 hour ago' +%s) --end-time $(date +%s) \
  --query-string 'fields @timestamp, @message | filter @message like /ERROR/ | limit 100' \
  --query 'queryId' --output text)

while true; do
  STATUS=$(aws logs get-query-results --query-id $QID --query 'status' --output text)
  [ "$STATUS" = "Complete" ] && break
  sleep 1
done

aws logs get-query-results --query-id $QID --query 'results[].[field, value]' --output table

レシピ 4 — 全アラームの状態確認

aws cloudwatch describe-alarms --state-value ALARM \
  --query 'MetricAlarms[].[AlarmName,StateValue,StateUpdatedTimestamp]' --output table

レシピ 5 — メトリクスを CSV で取得(後で Excel 集計)

aws cloudwatch get-metric-data \
  --metric-data-queries file://query.json \
  --start-time 2026-04-25T00:00:00Z --end-time 2026-04-26T00:00:00Z \
  | jq -r '.MetricDataResults[] | [.Id, (.Timestamps | join("|"))] | @tsv'

コマンド早見表

# Logs
aws logs tail /aws/lambda/F --follow --filter-pattern 'ERROR'
aws logs filter-log-events --log-group-name LG --filter-pattern '{ $.level = "error" }'
aws logs put-retention-policy --log-group-name LG --retention-in-days 14

# Logs Insights
aws logs start-query --log-group-name LG --start-time T0 --end-time T1 --query-string '...'
aws logs get-query-results --query-id QID

# Metrics
aws cloudwatch list-metrics --namespace AWS/Lambda
aws cloudwatch get-metric-data --metric-data-queries file://query.json ...
aws cloudwatch put-metric-data --namespace MyApp --metric-name X --value 1

# Alarms
aws cloudwatch put-metric-alarm --alarm-name N --metric-name Errors ...
aws cloudwatch describe-alarms --state-value ALARM
aws cloudwatch disable-alarm-actions --alarm-names N

# SNS
aws sns publish --topic-arn arn:... --message 'msg'

用語集

Log Group / Log Stream
Group = 論理的なログ束(リテンション・暗号化単位)。Stream = 1 ファイル相当(Lambda は実行コンテナ単位、EC2 はインスタンス単位)。
Retention (保持期間)
ログを保持する日数。デフォルト無期限。コスト垂れ流し防止に必須。
filter-pattern
シンプル文字列マッチ + JSON マッチ ({ $.x = "y" }) 構文。Logs Insights とは別物(より単純で速い)。
Logs Insights
SQL 風のクエリ言語で大量ログを集計・抽出。fields / filter / parse / stats / sort / limit が主要句。
Namespace / Dimension
Namespace = メトリクスの分類 (AWS/Lambda 等)。Dimension = キー/値ラベル (FunctionName=myfn 等)。
Statistic / Period
Statistic = Sum / Avg / Min / Max / pNN。Period = 集約区間(秒)。1 / 5 / 60 / 300 等。
get-metric-data vs get-metric-statistics
get-metric-data は新 API、複数メトリクスを並列・メトリクス数式対応。get-metric-statistics は古いがシンプル。新規は data 推奨。
MetricMath
m1 / m2 * 100 等の数式で派生メトリクスを作る機能。エラー率など。
Alarm 状態 (OK / ALARM / INSUFFICIENT_DATA)
OK = 閾値以下、ALARM = 閾値超え、INSUFFICIENT_DATA = データ不足。treat-missing-data で挙動を選べる。
Composite Alarm
複数 Alarm を AND/OR で組み合わせた合成アラーム。ノイズ削減に有効。
SNS Topic / Subscription
Topic = 通知の送信先カテゴリ。Subscription = 受信先(Email / SMS / Lambda / SQS 等)。Alarm から SNS → 通知の標準パターン。
Live Tail
Console / aws logs tail --follow でログをリアルタイム追跡する機能。デバッグに便利。
Dashboard
複数 Widget(メトリクス / ログクエリ / テキスト)を JSON で定義した Console ビュー。Terraform で IaC 化できる。
Container Insights / Lambda Insights
追加エージェントで CPU / メモリ / ネットワーク詳細を収集する拡張機能。深掘り用。
EMF (Embedded Metric Format)
JSON ログを書くだけで CloudWatch Metrics に変換される標準仕様。Lambda の自前メトリクス公開に便利。