CloudWatch Logs: ログ管理と分析 ​

システムトラブルシューティングにおいて、最も詳細な情報源となるのが「ログ」です。 メトリクス編で「何かがおかしい」と気づいたら、このログ編で「何が起きているか」を特定します。

CloudWatch Logs の基本構造 ​

  • ログイベント: タイムスタンプとメッセージ(1行のログなど)のペア。
  • ログストリーム: 同じソース(例: 1台のWebサーバー、1つのLambda関数)からの一連のログイベント。
  • ロググループ: 同じ性質のログストリームをまとめた箱(例: Production-WebServer-Logs)。設定(保存期間など)はここで管理します。

リアルタイム監視: Live Tail ​

従来、CloudWatch Logsは「数秒〜数分の遅延」があるのが欠点と言われてきましたが、新しい機能 Live Tail により、ログをほぼリアルタイムで流し見ることができるようになりました。

  • 使用感: Linuxの tail -f コマンドのように、新しいログが次々と画面に流れてきます。
  • 用途: デプロイ直後のエラー監視や、開発中の動作確認に最適です。
  • 注意: 起動している時間に対して課金されるため、見終わったら停止する必要があります。

ログ監視の仕組み ​

ログ監視には主に2つのアプローチがあります。

1. メトリクスフィルター (Metrics Filter) ​

特定の文字列(例: Error, Exception)が出現した回数をカウントし、メトリクス化します。 これにより、「エラーログが1分間に5回出たらアラーム」という設定が可能になります。

  • メリット: リアルタイム性が高い、コストが安い。
  • 用途: エラー発生の検知。

2. サブスクリプションフィルター (Subscription Filter) ​

ログをリアルタイムで他のサービス(Lambda, Kinesis, OpenSearch Service)に転送します。

  • 用途: ログを解析してSlackに通知する、OpenSearchで全文検索する、S3に長期保存する。

CloudWatch Logs Insights による分析 ​

Logs Insights は、大量のログに対してSQLライクな構文で検索・集計ができる強力なツールです。

基本的なクエリ構文 ​

sql
fields @timestamp, @message
| filter @message like /Error/
| sort @timestamp desc
| limit 20

よく使うクエリ集(チートシート) ​

特定の文字列を含むログを検索 ​

sql
filter @message like /Exception/

エラー数を5分ごとに集計してグラフ化 ​

sql
filter @message like /Error/
| stats count(*) as ErrorCount by bin(5m)

Lambdaの実行時間(Duration)の統計 ​

sql
filter @type = "REPORT"
| stats avg(@duration), max(@duration), min(@duration) by bin(1h)

JSONログのパース(構造化ログの活用) ​

ログがJSON形式で出力されている場合、parse コマンドを使うと非常に強力な分析が可能です。

ログ例: Let's say log is {"level": "error", "details": {"userId": "123", "action": "buy"}}

sql
filter @message like /error/
| parse @message '"userId": "*", "action": "*"' as userId, action
| stats count(*) by action

このように、テキストログから特定のフィールドを抽出して集計することができます。最初からJSON形式でログを出力(構造化ログ)しておくと、CloudWatch Logsが自動的にフィールドとして認識してくれるため、parseコマンドすら不要になり、さらに効率的です。

ログのコスト管理 ​

CloudWatch Logsは「取り込み」と「保存」の両方に課金されます。

  • 保存期間の設定: デフォルトは「無期限」です。デバッグ用ログは30日、監査ログは1年など、ロググループごとに適切な保持期間(Retention)を設定しましょう。
  • 不要なログの抑制: アプリケーション側でDEBUGログを出しすぎないよう、ログレベルを管理しましょう。

ログの長期保存とエクスポート ​

CloudWatch Logsに大量のログを長期間保存するとコストが高くなります。監査ログなどで数年間の保存が必要な場合は、より安価な Amazon S3 へエクスポート(アーカイブ)することをお勧めします。

  1. S3バケットの作成: ログ保存用のバケットを用意します。
  2. IAM権限の設定: CloudWatch LogsがS3に書き込めるよう、S3バケットポリシーを設定する必要があります(これがハマりポイントです)。
  3. エクスポートタスクの作成: CloudWatchコンソールから「データをS3にエクスポート」を選択します。

※定期的に自動エクスポートしたい場合は、LambdaとEventBridgeを使って自動化する仕組みを作るのが一般的です。


次のステップ