最近、現場では性能テストが行われていました。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. クエリを効率化するポイント
- フィールドを明示的に指定: 必要なフィールドだけを
fields
で指定することで、クエリの実行速度が向上します。 - フィルタ条件を最初に記述:
filter
を最初に記述することで、不要なデータを早い段階で除外できます。 - クエリ結果の確認と修正: 結果を逐次確認し、必要に応じてクエリを調整する習慣を持ちましょう。
5. まとめ
AWS CloudWatch Logs Insights のクエリ言語を使うことで、膨大なログデータから有益な情報を効率的に抽出できます。基本的なコマンドを組み合わせて、柔軟なクエリを作成しましょう。まずはシンプルなクエリから始め、徐々に複雑な条件や集計を活用していくことをおすすめします。
Logs Insights を活用して、より迅速な問題解決と効率的な運用を実現しましょう!