アプリログを集約し、Logs Insights で分析・メトリクスフィルターでエラーを検知してアラーム通知する
このハンズオンでは、アプリケーションログを CloudWatch Logs に集約し、Logs Insights でクエリ分析する方法と、メトリクスフィルターで特定のログパターン(ERROR など)をカウントしてメトリクス化し、アラーム → SNS 通知につなげる方法を学びます。ログベースの監視の実践パターンです。
| 項目 | 内容 |
|---|---|
| 所要時間 | 60〜75 分 |
| 難易度 | 中級 |
| 主要サービス | CloudWatch Logs、Logs Insights、メトリクスフィルター、SNS |
| 前提リソース | なし(テストログを手動投入するため EC2 不要) |
| 課金目安 | ログ取り込み $0.76/GB、Insights スキャン $0.0076/GB。少量なら数円程度 |
| 機能 | 用途 | リアルタイム性 |
|---|---|---|
| メトリクスフィルター | ログパターンを継続的にカウント → アラーム連携 | リアルタイム(自動評価) |
| Logs Insights | 過去ログをアドホックにクエリ分析・調査 | 手動実行(オンデマンド) |
実アプリのログの代わりに、CloudShell から擬似的なアプリログ(INFO/ERROR を含む JSON 風ログ)を CloudWatch Logs に投入します。EC2 などのリソースは不要で、ログ分析・監視の仕組みに集中できます。
/handson/app-logロググループのデフォルト保持期間は「失効しない(無期限)」です。テスト用のロググループは保持期間を短く設定しないと、ログが永久に蓄積してストレージ課金が増え続けます。
CloudShell からログストリームを作成し、テスト用のログイベントを投入します。
CloudShell(コンソール右上のターミナルアイコン)を開いて以下を実行します。
aws logs create-log-stream \
--log-group-name /handson/app-log \
--log-stream-name app-instance-1
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 行から再実行すれば追加投入できます。
fields @timestamp, @message | sort @timestamp desc | limit 20
「クエリの実行」をクリックすると、最新 20 件のログが時系列で表示されます。
fields @timestamp, @message | filter @message like /ERROR/ | sort @timestamp desc
parse @message /status=(?<status>\d+)/ | stats count(*) as cnt by status | sort cnt desc
| コマンド | 説明 |
|---|---|
| fields | 表示するフィールドを指定 |
| filter | 条件でログを絞り込み(like /正規表現/) |
| parse | ログから値を抽出して名前付きフィールド化 |
| stats | 集計(count, sum, avg など)by グループ化 |
| sort / limit | 並び替え / 件数制限 |
filter @message like /ERROR/ | stats count(*) as errors by bin(5m)
5 分ごとのエラー件数を集計します。「視覚化」タブで折れ線グラフとして表示できます。
ログ内の ERROR をカウントして、CloudWatch のカスタムメトリクスに変換します。
「パターンをテスト」をクリックすると、ERROR を含む行がマッチすることを確認できます。「次へ」。
「次へ」→ 確認 →「メトリクスフィルターを作成」をクリックします。
メトリクスフィルターは 作成後に投入されたログに対して評価されます。ステップ 2 で投入済みのログは集計されないため、ステップ 5 のテストでは新しい ERROR ログを再投入します。
通知先の SNS トピックを作成します(アラームハンズオンで作成済みなら再利用可)。
handson-logalarm-topicCloudShell で 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 の値を確認してください。
ロググループ(ログ保存)とアラームに課金が発生します。完了後は削除してください。
ロググループ /handson/app-log とアラーム handson-error-rate-alarm が一覧から消えていれば完了です。カスタムメトリクス(ErrorCount)は自動的に 15 か月後に失効します(手動削除は不可)。