CloudWatch Logs Insights + メトリクスフィルター

アプリログを集約し、Logs Insights で分析・メトリクスフィルターでエラーを検知してアラーム通知する

CloudWatch Logs Logs Insights メトリクスフィルター Amazon SNS マネコン操作 中級 所要時間 60〜75 分 v1.0

📋 概要

このハンズオンでは、アプリケーションログを CloudWatch Logs に集約し、Logs Insights でクエリ分析する方法と、メトリクスフィルターで特定のログパターン(ERROR など)をカウントしてメトリクス化し、アラーム → SNS 通知につなげる方法を学びます。ログベースの監視の実践パターンです。

項目内容
所要時間60〜75 分
難易度中級
主要サービスCloudWatch Logs、Logs Insights、メトリクスフィルター、SNS
前提リソースなし(テストログを手動投入するため EC2 不要)
課金目安ログ取り込み $0.76/GB、Insights スキャン $0.0076/GB。少量なら数円程度
ℹ️ メトリクスフィルター vs Logs Insights
機能用途リアルタイム性
メトリクスフィルターログパターンを継続的にカウント → アラーム連携リアルタイム(自動評価)
Logs Insights過去ログをアドホックにクエリ分析・調査手動実行(オンデマンド)

🏗️ 構成図

📝 アプリケーションログ(このハンズオンでは手動投入)
📦 CloudWatch Logs ロググループ(/handson/app-log)
↓ 2 つの使い方
🔍 Logs Insights(クエリ分析)

🔢 メトリクスフィルター(ERROR をカウント → カスタムメトリクス)
↓ メトリクスフィルターからアラーム
📊 CloudWatch アラーム → 📣 SNS → 📧 メール

✅ 前提条件

ℹ️ このハンズオンの進め方

実アプリのログの代わりに、CloudShell から擬似的なアプリログ(INFO/ERROR を含む JSON 風ログ)を CloudWatch Logs に投入します。EC2 などのリソースは不要で、ログ分析・監視の仕組みに集中できます。

🔧 ステップ 1: ロググループの作成

手順
  1. AWS コンソールで「CloudWatch」を開く
  2. 左メニュー → 「ログ」→「ロググループ」→「ロググループを作成」
  3. ロググループ名: /handson/app-log
  4. 保持期間: 1 週間(課金抑制のため。デフォルトは「無期限」)
  5. 「作成」
⚠️ 保持期間「無期限」に注意

ロググループのデフォルト保持期間は「失効しない(無期限)」です。テスト用のロググループは保持期間を短く設定しないと、ログが永久に蓄積してストレージ課金が増え続けます。

🔧 ステップ 2: テストログの投入

CloudShell からログストリームを作成し、テスト用のログイベントを投入します。

2-1. ログストリームの作成

CloudShell(コンソール右上のターミナルアイコン)を開いて以下を実行します。

aws logs create-log-stream \ --log-group-name /handson/app-log \ --log-stream-name app-instance-1

2-2. ログイベントの投入

INFO と ERROR を含む複数のログを投入します。以下をまとめて貼り付けて実行してください。

TS=$(date +%s000) aws logs put-log-events \ --log-group-name /handson/app-log \ --log-stream-name app-instance-1 \ --log-events \ timestamp=$TS,message="INFO user=alice action=login status=200" \ timestamp=$((TS+1000)),message="INFO user=bob action=view status=200" \ timestamp=$((TS+2000)),message="ERROR user=carol action=checkout status=500 msg=DBConnectionError" \ timestamp=$((TS+3000)),message="INFO user=dave action=login status=200" \ timestamp=$((TS+4000)),message="ERROR user=eve action=payment status=503 msg=Timeout"
✅ 確認

CloudWatch → ロググループ → /handson/app-log → app-instance-1 ストリームを開くと、投入した 5 件のログが表示されます。

ℹ️ もっとログを増やしたい場合

ステップ 4・5 でメトリクスフィルターのアラームを確実に発火させるには、ERROR ログを複数回投入すると確認しやすくなります。上記コマンドの TS 行から再実行すれば追加投入できます。

🔧 ステップ 3: Logs Insights でのクエリ分析

3-1. Logs Insights を開く

手順
  1. CloudWatch → 左メニュー「ログ」→「ログのインサイト」
  2. ロググループの選択: /handson/app-log
  3. 時間範囲: 「1h」または「3h」

3-2. 基本クエリ:全ログの表示

fields @timestamp, @message
| sort @timestamp desc
| limit 20

「クエリの実行」をクリックすると、最新 20 件のログが時系列で表示されます。

3-3. ERROR だけを抽出

fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc

3-4. ステータスコード別の集計

parse @message /status=(?<status>\d+)/
| stats count(*) as cnt by status
| sort cnt desc
ℹ️ Logs Insights クエリ構文
コマンド説明
fields表示するフィールドを指定
filter条件でログを絞り込み(like /正規表現/
parseログから値を抽出して名前付きフィールド化
stats集計(count, sum, avg など)by グループ化
sort / limit並び替え / 件数制限

3-5. エラー率の時系列集計

filter @message like /ERROR/
| stats count(*) as errors by bin(5m)

5 分ごとのエラー件数を集計します。「視覚化」タブで折れ線グラフとして表示できます。

🔧 ステップ 4: メトリクスフィルターの作成

ログ内の ERROR をカウントして、CloudWatch のカスタムメトリクスに変換します。

4-1. メトリクスフィルターの作成

手順
  1. CloudWatch → ロググループ → /handson/app-log を開く
  2. 「メトリクスフィルター」タブ → 「メトリクスフィルターを作成」

4-2. フィルターパターンの設定

設定値
フィルターパターン
ERROR
テスト用ログデータ
「カスタムログデータ」でステップ 2 のログを貼り付けてテスト可能

「パターンをテスト」をクリックすると、ERROR を含む行がマッチすることを確認できます。「次へ」。

4-3. メトリクスの割り当て

設定値
フィルター名
handson-error-count-filter
メトリクス名前空間
Handson/AppLog
メトリクス名
ErrorCount
メトリクス値
1(マッチごとに 1 をカウント)
デフォルト値
0

「次へ」→ 確認 →「メトリクスフィルターを作成」をクリックします。

⚠️ メトリクスは作成後のログから集計される

メトリクスフィルターは 作成後に投入されたログに対して評価されます。ステップ 2 で投入済みのログは集計されないため、ステップ 5 のテストでは新しい ERROR ログを再投入します。

🔧 ステップ 5: メトリクスフィルターからアラーム → SNS 通知

5-1. SNS トピックの準備

通知先の SNS トピックを作成します(アラームハンズオンで作成済みなら再利用可)。

手順
  1. SNS → トピックの作成 → スタンダード → 名前 handson-logalarm-topic
  2. サブスクリプション作成 → Eメール → メールアドレス入力 → 確認メールの「Confirm subscription」をクリック

5-2. アラームの作成

手順
  1. CloudWatch → ロググループ → /handson/app-log → 「メトリクスフィルター」タブ
  2. handson-error-count-filter → 「アラームを作成」
設定値
統計
合計
期間
5 分
条件
以上(>=)3(5 分間に ERROR が 3 件以上)
欠落データの処理
適切(notBreaching)として処理
SNS トピック
handson-logalarm-topic
アラーム名
handson-error-rate-alarm

5-3. アラームの発火テスト

CloudShell で ERROR ログを 5 件まとめて投入し、5 分以内にアラームを発火させます。

TS=$(date +%s000) aws logs put-log-events \ --log-group-name /handson/app-log \ --log-stream-name app-instance-1 \ --log-events \ timestamp=$TS,message="ERROR test error 1" \ timestamp=$((TS+100)),message="ERROR test error 2" \ timestamp=$((TS+200)),message="ERROR test error 3" \ timestamp=$((TS+300)),message="ERROR test error 4" \ timestamp=$((TS+400)),message="ERROR test error 5"
✅ 期待結果

数分後(メトリクス集計とアラーム評価の遅延あり)、ErrorCount メトリクスが 5 になり、閾値 3 を超えてアラームが ALARM 状態になります。handson-logalarm-topic から通知メールが届きます。

ℹ️ メトリクス反映の遅延

メトリクスフィルターによるカスタムメトリクスの反映には数分かかります。アラームが INSUFFICIENT_DATA のまま動かない場合は、5〜10 分待ってから CloudWatch → メトリクス → 「Handson/AppLog」名前空間で ErrorCount の値を確認してください。

🧹 クリーンアップ

⚠️ 課金注意

ロググループ(ログ保存)とアラームに課金が発生します。完了後は削除してください。

削除手順

  1. アラームの削除:CloudWatch → アラーム → handson-error-rate-alarm → 削除
  2. メトリクスフィルターの削除:ロググループ → メトリクスフィルタータブ → handson-error-count-filter → 削除
  3. ロググループの削除:CloudWatch → ロググループ → /handson/app-log → 削除
  4. SNS の削除:サブスクリプション → 削除 → トピック handson-logalarm-topic → 削除
✅ 削除確認

ロググループ /handson/app-log とアラーム handson-error-rate-alarm が一覧から消えていれば完了です。カスタムメトリクス(ErrorCount)は自動的に 15 か月後に失効します(手動削除は不可)。