AWS CloudWatch の Logs Insights のクエリ言語を使いこなす

最近、現場では性能テストが行われていました。APサーバがあるVPCからほかのVPCまたはオンプレミス環境への通信時間や通信データ量などLogs Insightsで集計しました。
最初の方はLogs Insights(ログのインサート)って何?から始まり、最終的には自分なりにVPC フローログに対してのLogs Insightsを使いこなしていたと思います。
本記事では、Logs Insightsの基本的な使い方から、実用的なクエリ例までを解説します。

AWS CloudWatch Logs Insightsとは

まず、AWS CloudWatch Logs Insightsとは、ログデータを効率的に検索、分析するための強力なツールです。
大量のログデータから必要な情報を素早く抽出するには、CloudWatch Logs Insights のクエリ言語を理解して活用することが重要です。

1. CloudWatch Logs Insights の基本

アクセス

そもそも、Logs Insightsにどうやってアクセスするでしょうか。

AWSコンソール画面 →「CloudWatch」→「ログ」→「ログのインサイト」をクリックすると、本ブログのタイトル上の画像のような画面が表示されます。

クエリの構成

Logs Insights のクエリ言語は、以下のようなシンプルな構成を持っています。

  • フィールドの選択 (fields): 表示したいフィールドを指定。
  • フィルタリング (filter): 特定の条件に一致するログだけを絞り込む。
  • 集計 (stats): データをグループ化し、統計情報を計算。
  • ソート (sort): データを昇順または降順に並べ替え。
  • 制限 (limit): 結果の行数を制限。

これらを組み合わせて柔軟なクエリを作成できます。

フィールド

VPC フローログをクエリする際に、よく使用するフィールドは以下のとおりです。

@timestamp, @logStream, @message, accountId, endTime, interfaceId, logStatus, startTime, version, action, bytes, dstAddr, dstPort, packets, protocol, srcAddr, srcPort

2. クエリの例

以下に、基本的なクエリの例を示します。

例1: 取得ログ件数制限の検索

fields @timestamp, @logStream, @message, accountId, endTime, interfaceId, logStatus, startTime, 
version, action, bytes, dstAddr, dstPort, packets, protocol, srcAddr, srcPort
| sort @timestamp desc
| limit 10
  • fields: @timestamp, @logStream, @message, accountId, endTime, interfaceId, logStatus, startTime, version, action, bytes, dstAddr, dstPort, packets, protocol, srcAddr, srcPort を表示。フィールドが多い場合、改行しても可能。
  • sort: タイムスタンプで降順に並べ替え。
  • limit: 最大10件を取得。
    結果例

    一覧の右側フィールド

3. 実用的な応用例

例2: 特定の文字列を一致するログを検索

fields @timestamp, interfaceId, action, dstAddr, dstPort, srcAddr, srcPort, protocol
# | filter action in ['ACCEPT']
| filter action in ['REJECT']
| sort @timestamp desc
  • fields: @timestamp, interfaceId, action, dstAddr, dstPort, srcAddr, srcPort, protocol を表示。
  • filter: action の値が「REJECT」と一致しているログを絞り込む。
    # | filter action in ['ACCEPT']をコメントアウトしてあります。もし次ACCEPTのログを検索したい場合、filterの部分を

    | filter action in ['ACCEPT']
    # | filter action in ['REJECT']

    にすればいいです。とても便利だと思います。

  • sort: タイムスタンプで降順に並べ替え。
    結果例

例3: 送信先アドレス別のリクエスト数を集計

fields @timestamp, interfaceId, action, dstAddr, dstPort, srcAddr, srcPort, protocol
| filter action in ['ACCEPT']
| stats count(*) by dstAddr
| sort dstAddr desc
  • stats: 送信先アドレス別にリクエスト数を集計。
  • sort: 送信先アドレスで降順に並べ替え。
    結果例

例4: 送信先アドレスごとに転送される平均バイト数を計算

fields @timestamp, interfaceId, action, bytes, dstAddr, dstPort, srcAddr, srcPort, protocol
| filter action in ['ACCEPT']
| stats avg(bytes) as avg_bytes by dstAddr
| sort avg_bytes desc
  • stats avg(bytes): 平均バイト数の集計。
  • by dstAddr: 送信先アドレスごとに。
  • sort: 平均バイト数で降順に並べ替え。
    結果例

4. クエリを効率化するポイント

  1. フィールドを明示的に指定: 必要なフィールドだけを fields で指定することで、クエリの実行速度が向上します。
  2. フィルタ条件を最初に記述: filter を最初に記述することで、不要なデータを早い段階で除外できます。
  3. クエリ結果の確認と修正: 結果を逐次確認し、必要に応じてクエリを調整する習慣を持ちましょう。

5. まとめ

AWS CloudWatch Logs Insights のクエリ言語を使うことで、膨大なログデータから有益な情報を効率的に抽出できます。基本的なコマンドを組み合わせて、柔軟なクエリを作成しましょう。まずはシンプルなクエリから始め、徐々に複雑な条件や集計を活用していくことをおすすめします。

Logs Insights を活用して、より迅速な問題解決と効率的な運用を実現しましょう!

Last modified: 2024-12-01

Author