CloudWatch + CloudWatch Logs — 40+ コマンドを 6 カテゴリで
AWS の標準モニタリング基盤。Logs(ログ集約)と Metrics(数値時系列)と Alarms(閾値通知)の 3 つを CLI で操作。 Console で迷子になりがちな絞り込みも、CLI なら 1 行で済むことが多いです。
目次
- Logs グループ・ストリーム
- ログ tail / filter
- Logs Insights (クエリ言語)
- Metrics 取得
- Alarms 作成・管理
- Dashboard / 出力先 (SNS)
- 運用レシピ
- 用語集
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 の自前メトリクス公開に便利。