CloudWatch Logs Insightsクエリ入門|SREがよく使うパターン10選

AWS監視・オブザーバビリティ

本記事では、Amazon CloudWatch Logs Insightsのクエリ構文と、SRE実務でよく使うパターン10選を解説します。

この記事でわかること

  • CloudWatch Logs Insightsの基本クエリ構文(fields / filter / stats / sort / parse)
  • 障害調査・パフォーマンス分析・コスト監視で使えるクエリパターン10選
  • Insightsを使う上での注意点(コスト・件数上限・タイムゾーン)
  • AWSコンソールでのInsights操作手順

前提条件

  • AWSアカウントがある
  • CloudWatch Logsにログが収集されている(エージェント設定済み、またはLambda/ECS等からの自動収集)

CloudWatch Logsの基本設定については「CloudWatch Logsの使い方完全ガイド|SREが実務で使うログ監視・Insights分析」を合わせて参照してください。


AWS CloudWatch Logs Insights screen with a code query panel on the left showing filter and stats com
  1. CloudWatch Logs Insightsとは
    1. CloudWatch Logs Insightsが解決する課題
    2. CloudWatch Logsとの関係
  2. CloudWatch Logs Insightsの基本クエリ構文
    1. fieldsコマンド ——表示するフィールドを指定する
    2. filterコマンド ——条件で絞り込む
    3. statsコマンド ——集計する
    4. sortとlimitコマンド ——並べ替えと件数制限
    5. parseコマンド ——非構造化ログを解析する
  3. よく使うクエリパターン10選
    1. パターン1:エラーログを絞り込む
    2. パターン2:エラー件数を時系列で集計する
    3. パターン3:レスポンスタイムが遅いリクエストを特定する
    4. パターン4:エンドポイント別の平均レスポンスタイムを集計する
    5. パターン5:特定のリクエストIDでログを追跡する
    6. パターン6:LambdaのタイムアウトとエラーをCold Startと分けて集計する
    7. パターン7:ALBアクセスログを分析する
    8. パターン8:ECS・Kubernetesのコンテナログを分析する
    9. パターン9:特定IPアドレスからのアクセスを追跡する
    10. パターン10:ログの急激な減少(サービス停止の疑い)を検知する
  4. Insightsを使う上での注意点
    1. タイムゾーンはUTCで管理される
    2. スキャンデータ量に比例してコストが発生する
    3. クエリ結果は最大10,000件
  5. コンソールでのInsights操作手順
    1. Step 1:Insightsページを開く
    2. Step 2:クエリ対象のロググループを選択する
    3. Step 3:時間範囲を指定する
    4. Step 4:クエリを入力して実行する
    5. Step 5:よく使うクエリを保存する
    6. Step 6:ダッシュボードに追加する
  6. まとめ

CloudWatch Logs Insightsとは

CloudWatch Logs Insightsは、CloudWatch Logsに収集されたログを SQLライクな独自クエリ言語 で検索・集計できる分析機能です。

複数のロググループを横断して検索でき、結果をグラフとして可視化することもできます。SSH接続やサードパーティツール不要で、AWSコンソールから直接ログの詳細分析が行えます。

CloudWatch Logs Insightsが解決する課題

ログ調査でよくある課題と、Insightsが提供する解決策を整理します。

課題 Insightsの解決策
複数インスタンスのログを横断検索できない 複数ロググループを一括クエリ
エラーが何件あるか数えられない stats count() で集計
特定リクエストのログを追跡できない filter requestId = "xxx" で絞り込み
どのエンドポイントが遅いか特定できない stats avg(responseTime) by endpoint

CloudWatch Logsとの関係

Insightsは CloudWatch Logs の 追加機能 であり、独立したサービスではありません。CloudWatch Logsにデータが収集されていれば、追加設定なしでInsightsを使い始められます。

graph TD

A["ログソース

EC2 / Lambda / ECS / ALB"] --> B["CloudWatch Logs

(ロググループ)"]

B --> C["Logs Insights

(クエリ・分析)"]

C --> D["グラフ表示"]

C --> E["CloudWatchダッシュボードに埋め込み"]

Five command blocks arranged vertically labeled

CloudWatch Logs Insightsの基本クエリ構文

Insightsのクエリ言語は5つのコマンドで構成されます。それぞれのコマンドを | で連結して使います。

fields @timestamp, @message
| filter @message like /ERROR/
| stats count(*) by bin(5m)
| sort @timestamp desc
| limit 100

fieldsコマンド ——表示するフィールドを指定する

fields @timestamp, @message, @logStream

fields で表示したいフィールドを指定します。@timestamp(タイムスタンプ)・@message(ログ本文)・@logStream(ログストリーム名)はInsightsが自動で付与する組み込みフィールドです。

JSON形式のログであれば、fields level, message, requestId のようにフィールド名を直接指定できます。

filterコマンド ——条件で絞り込む

filter @message like /ERROR/        # 部分一致(正規表現)
filter level = "ERROR"              # 完全一致
filter responseTime > 1000          # 数値比較
filter @message not like /health/   # 否定

like は正規表現による部分一致です。完全一致の場合は = を使います。複数条件は and / or で結合できます。

filter level = "ERROR" and service = "payment"

statsコマンド ——集計する

stats count(*) as errorCount by bin(5m)
stats avg(responseTime) by endpoint
stats count(*) by level

stats は最も強力なコマンドです。count()avg()sum()max()min()pct() などの集計関数が使えます。

bin(5m) は時間軸でのグループ化です。1m5m1h などの単位で指定します。

sortとlimitコマンド ——並べ替えと件数制限

sort responseTime desc    # レスポンスタイムの大きい順
limit 20                  # 上位20件のみ表示

sort の後に asc(昇順)または desc(降順)を指定します。limit はデフォルト1,000件のところ、任意の件数に制限できます。

parseコマンド ——非構造化ログを解析する

parse @message "* * * *" as method, path, statusCode, responseTime

JSON形式でないプレーンテキストのログに対して、parse でフィールドを抽出できます。正規表現を使ったより高度な抽出も可能です。

parse @message /(?<statusCode>\d{3}) (?<responseTime>\d+)ms/

Grid of 10 numbered tile icons showing different AWS monitoring scenarios: error log, time series ch

よく使うクエリパターン10選

パターン1:エラーログを絞り込む

障害発生時に最初に使うパターンです。特定の時間帯に発生したエラーを素早く抽出します。

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

活用場面: アラート発火後の初動調査。どのインスタンスで何のエラーが出ているかを最速で確認できます。

JSONログの場合は filter level = "ERROR" に変えると、ログ本文中の “ERROR” という単語に反応しない分、ノイズが減ります。


パターン2:エラー件数を時系列で集計する

単なる絞り込みではなく、「いつからエラーが増えたか」を可視化します。

fields @timestamp, @message
| filter @message like /ERROR/
| stats count(*) as errorCount by bin(5m)
| sort @timestamp asc

このクエリは結果を 棒グラフ で表示でき、CloudWatchダッシュボードに埋め込むことも可能です。デプロイや設定変更のタイミングとエラー数の増加が一目で相関できます。


パターン3:レスポンスタイムが遅いリクエストを特定する

パフォーマンス劣化の調査で使います。応答時間が閾値を超えたリクエストのみを抽出します。

fields @timestamp, requestId, path, responseTime
| filter responseTime > 2000
| sort responseTime desc
| limit 30

responseTime > 2000 は2,000ミリ秒(2秒)以上のリクエストを絞り込む例です。ログのフィールド名はアプリケーションの実装に合わせて変更してください。


パターン4:エンドポイント別の平均レスポンスタイムを集計する

どのAPIが全体的に遅いかを俯瞰的に確認します。

fields path, responseTime
| stats avg(responseTime) as avgTime,
        max(responseTime) as maxTime,
        count(*) as requestCount
        by path
| sort avgTime desc
| limit 20

avgmaxcount を組み合わせることで、「平均は速いが稀に極端に遅い」エンドポイントも検出できます。


パターン5:特定のリクエストIDでログを追跡する

分散システムで特定リクエストの処理フローを追跡する際に使います。

fields @timestamp, @message, @logStream
| filter requestId = "abc123-def456"
| sort @timestamp asc

複数のサービス・コンテナにまたがるリクエストも、リクエストIDが一貫して付与されていれば、複数ロググループを選択してこのクエリを実行することで横断追跡できます。


パターン6:LambdaのタイムアウトとエラーをCold Startと分けて集計する

Lambda固有のログ構造に対応したパターンです。

fields @timestamp, @message
| filter @message like /Task timed out/ or @message like /ERROR/ or @message like /REPORT/
| stats count(*) as count by @message
| sort count desc
| limit 10

Lambda の実行ログには REPORT 行にDuration(実行時間)とMax Memory Usedが含まれます。タイムアウト直前のDurationを確認するには以下のクエリが有効です。

fields @timestamp, @message
| filter @message like /REPORT/
| parse @message "Duration: * ms" as duration
| filter duration > 25000
| stats count(*) as timeoutRisk by bin(1h)

パターン7:ALBアクセスログを分析する

ALBのアクセスログをCloudWatch Logsに転送している場合に使えるパターンです。

fields @timestamp, @message
| parse @message '* * * * * * * * * * * "* *" "* * *"' as
  type, time, elb, client_ip, target, request_processing_time,
  target_processing_time, response_processing_time, elb_status_code,
  target_status_code, received_bytes, sent_bytes, request_verb,
  request_url, http_version, ssl_cipher, ssl_protocol
| filter elb_status_code like /5/
| stats count(*) as errorCount by elb_status_code, request_url
| sort errorCount desc
| limit 20

HTTP 5xx エラーが多いURLを一覧化できます。エラーページや特定エンドポイントの問題を素早く特定できます。


パターン8:ECS・Kubernetesのコンテナログを分析する

ECS・EKS環境では複数コンテナのログが1つのロググループにまとまっています。コンテナ名でフィルタリングします。

fields @timestamp, @message, @logStream
| filter @logStream like /payment-service/
| filter @message like /ERROR/
| stats count(*) as errorCount by bin(10m)
| sort @timestamp asc

@logStream はコンテナID・タスクIDを含むため、特定サービスのログストリームに絞る場合は like で部分一致指定します。


パターン9:特定IPアドレスからのアクセスを追跡する

セキュリティ調査や不審なアクセス調査で使います。

fields @timestamp, @message
| filter @message like /192.168.1.100/
| sort @timestamp asc
| limit 100

like でIPアドレスを部分一致指定します。JSON構造化ログであれば filter clientIp = "192.168.1.100" のように完全一致で絞り込む方が確実です。


パターン10:ログの急激な減少(サービス停止の疑い)を検知する

ログが突然出なくなるケースはサービス停止・エージェント障害のサインです。5分ごとのログ件数を出して異常を可視化します。

fields @timestamp, @message
| stats count(*) as logCount by bin(5m)
| sort @timestamp asc

通常時のログ件数と比較して、ある時点から急激に減少していれば、アプリケーションの停止や CloudWatch エージェントの障害が疑われます。


Three warning sign icons labeled

Insightsを使う上での注意点

タイムゾーンはUTCで管理される

Insightsのタイムスタンプは UTC(協定世界時) で表示されます。日本時間(JST = UTC+9)に変換して確認する必要があります。

AWSコンソールの時間入力フォームも UTC で指定します。「日本時間の15時」に発生した障害を調査する場合は、「06:00 UTC」と入力してください。

スキャンデータ量に比例してコストが発生する

Insightsのクエリは スキャンしたデータ量(GB単位)に課金 されます(2026年時点:0.0076 USD/GB)。

コストを抑えるポイントは以下の通りです。

  • 時間範囲を絞る: 24時間ではなく1〜2時間に限定するだけでコストが大幅に下がります
  • クエリ対象ロググループを絞る: 全ロググループではなく調査対象に絞る
  • limit を活用する: 全件取得が不要な場合は limit 100 等を指定する

クエリ結果は最大10,000件

1回のクエリで返せる結果は 最大10,000件 です。それ以上のデータを取得する場合は時間範囲を分割してクエリを実行するか、S3へのエクスポートを検討してください。

また、1アカウントあたり同時実行できるInsightsクエリ数には上限があります(デフォルト30クエリ)。大量のダッシュボードウィジェットを一度に更新する場合は注意が必要です。


Step-by-step flow showing AWS Management Console icon, then arrow to CloudWatch service page, then t

コンソールでのInsights操作手順

Step 1:Insightsページを開く

AWSコンソールにログインし、「CloudWatch」→ 左メニューの「ログ」→「Logs Insights」を選択します。

Step 2:クエリ対象のロググループを選択する

ページ上部の「ロググループを選択」から1つ以上のロググループを選択します。複数選択すると横断検索が可能です。

Step 3:時間範囲を指定する

右上の時間範囲セレクターで検索対象の期間を指定します。「相対」(過去1時間・過去24時間等)と「絶対」(日時を直接指定)が選べます。

Step 4:クエリを入力して実行する

クエリエディタにクエリを貼り付けて「クエリを実行」ボタンをクリックします。結果が下部に表示され、stats コマンドを使ったクエリはグラフとして可視化されます。

Step 5:よく使うクエリを保存する

「クエリを保存」ボタンでクエリに名前をつけて保存できます。チーム共有フォルダに保存することで、インシデント時にすぐ呼び出せます。

Step 6:ダッシュボードに追加する

グラフ表示状態で「ダッシュボードに追加」ボタンをクリックすると、CloudWatchダッシュボードにInsightsウィジェットとして埋め込めます。定点観測に有効です。


まとめ

本記事で解説した内容を整理します。

  • 基本構文: fieldsfilterstatssortlimitparse の6コマンドを組み合わせる
  • パターン1〜2: エラーログの絞り込みと時系列集計——障害の初動調査で最初に使う
  • パターン3〜4: レスポンスタイム分析——どのリクエスト・エンドポイントが遅いかを特定する
  • パターン5: リクエストID追跡——分散システムでのトレース調査
  • パターン6: Lambda固有のタイムアウト・エラー監視
  • パターン7: ALBアクセスログの5xxエラー集計
  • パターン8: ECS・Kubernetesのコンテナログ横断分析
  • パターン9: 不審なIPアドレスのアクセス追跡
  • パターン10: ログ減少によるサービス停止の疑い検知
  • 注意点: UTCタイムゾーン・スキャンコスト・10,000件上限を把握しておく

CloudWatch Logs Insightsを使いこなすことで、障害調査の MTTR(平均修復時間)を大幅に短縮できます。まずはパターン1・2・3を手元の環境で試してみてください。

CloudWatchの全体像については「CloudWatch入門|SREが最初に設定すべき5つの機能と優先順位」、アラーム設定については「CloudWatchアラートの設定方法|閾値・通知先をSRE視点で設計する手順」も合わせて参照してください。


SREとしてCloudWatchをより深く学びたい方へ

CloudWatch Logs Insightsの活用からSLO設計・インシデント対応まで、SRE実務に必要なスキルを体系的に学べるUdemyコースを公開しています。

▶ AWS×SRE入門〜CloudWatchで学ぶ監視設計の基礎〜を見てみる

ずんだもん解説で楽しく学べる入門コースです。SRE転職を目指しているエンジニアにもおすすめです。

コメント

タイトルとURLをコピーしました