👌

LambdaのログをCloudWatch Logsで確認する~FirstStep~

2023/05/27に公開

概要

次の2つの方法を紹介します。

  • CloudWatch Logs Insightsを使ってログを絞り込む
  • CloudWatch Logsのロググループ>ログストリームをフィルターパターンで絞り込む

背景

LambdaのログはデフォルトでCloudWatch Logsに蓄積されます。
APIGateway + LambdaでREST APIを構築したり、Lambdaでバッチ処理をしていると、過去のログからエラーが起きた箇所のログを検索したいケースや特定の文字列を出力してデバッグしたい場合などログを絞り込んだりしたいケースがあると思います。

CloudWatch Logsはマネジメントコンソールで辿り着くことはできるけど、詳細の絞り込みとかとなるとやり方が分からない!のようなことがよくあると思います(主観)

そこで、ログを絞り込んでデバッグするための最低限の方法を残しておきたいと思います。

CloudWatch Logsとは

CloudWatch Logsはロググループとログストリームという概念があり、以下の図のような関係です。

引用: https://blog.serverworks.co.jp/tech/2019/11/29/cfnlogstream/

それぞれは次のようなイメージです。

  • ロググループ: アプリケーションのログまたは特定のAWSリソースのログを格納する箱
  • ログストリーム: ロググループに格納される個々のログイベントのシーケンス

マネジメントコンソールからは、CloudWatch > ログ > ロググループ でアクセスできます。

CloudWatch Logs Insightsを使ってログを絞り込む

CloudWatch Logs Insightsへアクセス

マネジメントコンソールから、 CloudWatch > ログ > ログのインサイト へアクセスします。

CloudWatch Logs Insighgsのデフォルトクエリを少し説明

CloudWatch Logs Insightsの画面で、クエリを書いてログの絞り込みをしていきます。

fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 20

とデフォルトではなっていて、意味は次のようになります。

取得するログのフィールド=(@timestamp, @message, @logStream, @log)でタイムスタンプ順にdescでソートして20件まで表示する。

それぞれのフィールド要素については公式から引用すると次のような意味になります。

  • @message
    • 生の未解析のログイベントを示します。これは、InputLogevent の message フィールドに相当します。
  • @timestamp
    • ログイベントの timestamp フィールドに含まれるイベントタイムスタンプが含まれます。これは、InputLogevent の timestamp フィールドに相当します。
  • @logStream
    • ログイベントの追加先のログストリームの名前を示します。ログストリームは、生成時と同じプロセスでログをグループ化します。
  • @log
    • ロググループ識別子です。account-id:log-group-nameこれは、複数のロググループにクエリを実行する場合に、特定のイベントが属しているロググループを識別するのに役立ちます。

引用: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html

指定した文字列(ERROR)でログを絞り込む

  1. 絞り込みをしたいロググループを選択します。(例: Lambdaのロググループをプルダウンから選択)
  2. クエリを次のように書き換える
    fields @timestamp, @message
    | sort @timestamp desc
    | filter @message like /ERROR/
    | limit 20
    
  3. 絞り込みをしたい時間を画面右上の時間設定UIで指定
  4. クエリ の実行
| filter @message like /ERROR/

この部分が追加された部分で、文字列の一致による絞り込みを追加しています。

絞り込み結果

クエリの結果、ヒットすれば、画像のように件数毎に表示されます。
メッセージの内容を見たい場合はトグルを開いたり、前後のログを見たい場合はlogStreamがリンクになっているのでリンクへ飛ぶとログストリームへアクセスすることができます。

その他の絞り込み

別の条件でクエリしたい場合の説明は省略させていただきますが、公式やTECHブログを参考になると思います!

公式のサンプルクエリ: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-examples.html

AWS Cloud Watch logs Insightでよく使う構文: https://www.clara.jp/media/?p=7429#i

CloudWatch Logsのロググループ>ログストリームをフィルターパターンで絞り込む

絞り込み手順

  1. CloudWatch ロググループの画面へ移動する
  2. 絞り込みをしたいロググループを選択する(リンクへ移動する)
  3. 検索したい対象を選択する
    • 全てのログストリームの場合: すべてのログストリームを検索 を押す
    • 特定のログストリームの場合: 該当のログストリームを選択して移動する
  4. フィルタパターンを入力して絞り込む
    例: ERROR と入力してエンター → ERRORで絞り込み

フィルタパターンと構文の詳細

こちらのドキュメントが参考になります。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html

例として次のような構文が用意されています。

  • 複合数のキーワードをAND条件で検索
ERROR ARGUMENTS
  • 複合数のキーワードをOR条件で検索
?ERROR ?ARGUMENTS
  • 正確なフレーズが含まれるように検索
"INTERNAL SERVER ERROR"

注意点

ログストリームをフィルターパターンで絞り込む場合、ログストリームのリストからだとどこに絞り込みたいイベント(APIリクエスト等)のログがあるか分からないことが多いと思います。その際に、個別のログストリームに移動してフィルタするとログが1件も見つからないということになってしまうことがあるので、 すべてのログストリームを検索 を使ったり、CloudWatch Logs Insightで絞り込んだりしてみると良いと思います。

最後に

CloudWatchは機能が年々追加されていったり、UI面や機能面など進化し続けていて、CloudWatch Logs以外にも外形監視(Synthetics)やRUM、X-Ray(最近CloudWatchのUIに加わった)なども見てみるのも面白いかと思います。良いCloudWatch LIFEを!!

Discussion