CloudWatch Logs メトリクスフィルターにより発行されたメトリクスの画面から「ログの表示」を押してフィルターパターンにマッチしたログをお手軽に検索する

え!ログイベントを検索するときにフィルターパターンも表示期間も手入力しなくていいんですか!

この「ログの表示」を押したらどうなるんだろう

コンバンハ、千葉(幸)です。

突然ですが皆さんは以下の画面の「ログの表示」を押したことはありますか?

CloudWatch_Management_Console_View_Log

これは CloudWatch コンソールのメトリクスの画面です。[アクション] → [ログの表示] という項目が用意されていますが、わたしはつい最近まで気にしたことがありませんでした。

オッ ちょっと気になるな」とメトリクスの画面を覗いた方、多くの場合 該当箇所がリンクになっていたのではないでしょうか。

CloudWatch_Management_Console_view_log-5383091

このリンクは押してもそこまで面白くありません。

今回取り上げたいのはひとつ目の画像のパターンです。メトリクスフィルターを使っているときにめちゃくちゃ便利じゃん……となったので、その押し心地を紹介します。

メトリクスフィルターによるメトリクスの発行

先にメトリクスフィルターについて基本的な部分を押さえておきましょう。

メトリクスフィルターは CloudWatch Logs ロググループに関連づけて使用します。大まかには以下の組み合わせからなります。

  • ロググループ内に出力されたログイベントを評価するフィルターパターンの定義
  • フィルターパターンに合致した場合にどのようなメトリクス(名前空間/メトリクス名/値)を発行するかの定義

例えば「ログイベントにErrorという文字列が含まれていたらCustom/ErrorCountという CloudWatch メトリクスに1を発行する」という定義ができます。出力された CloudWatch メトリクスには CloudWatch アラームを設定できますので、ログ監視の仕組みを実装したい、というときに活躍します。

このメトリクスが発行されたのはどのログイベントがきっかけだろう

メトリクスフィルターの仕組みは先述の通りなので、発行されたメトリクスから読み取れる情報はかなり削ぎ落とされています。

例えば以下の画像を見て読み取れるのは「2022-06-10 17:12 にフィルターパターンに合致するログイベントが 3 件あった *1」ということだけです。

Metric_logfilter

ちなみに上記の例は CloudTrail ログのイベントを評価するものであり、以下のフィルターパターンを設定したメトリクスフィルターから発行されたメトリクスです。

{($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventName=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolicy)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=DeletePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersion)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.eventName=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGroupPolicy)||($.eventName=DetachGroupPolicy)}

IAM ポリシーの変更に関するイベントが記録された際にメトリクスが発行されますが、誰の何に対するどんな操作なのか?はログイベントを確認しないと判別できません。

実際にコンソール上で操作をするなら、以下のステップを踏む必要があります。

  • メトリクスフィルターが関連づけられているロググループの検索画面に遷移する
  • 以下を指定し検索を実行する
    • フィルターパターン
    • メトリクスが発行された周辺の期間

極端に手間というわけではないですが、「どのロググループだっけ?」「フィルターパターンをコピペしなきゃ」「表示する期間 JST だとどう指定しよう」など、地味な面倒さがつきまといます。

それ「ログの表示」からワンクリックでできますよ

ここでようやく冒頭で見た「ログの表示」の出番です。

今回は CloudWatch アラームでアラート通知が行われたケースを想定し、そこからメトリクスを辿って大元のログイベントを検索する手段をさらってみます。

CloudWatch アラームの詳細画面から、[メトリクスで表示] を押下します。

CloudWatch_Management_Console_goto_metric

メトリクスの詳細画面に遷移しました。メトリクスが発行された周辺の時間にズームし(ちなみにここでは UTC 表記です)、[アクション] → [ログの表示] を押下します。……と言いたいところですが、2022/6/17現在 わたしの環境ではボタンを押下しても反応がありませんでした。

CloudWatch_Management_Console_view_logs-5400278

新しめのコンソールだからかな?ということで [元のインターフェイスに切り替える]を押下して従来のコンソールに切り替えます。

[アクション] → [ログの表示] にカーソルを合わせるとこのメトリクスを発行したメトリクスフィルターが関連づけられた CloudWatch Logs ロググループが表示されるため、押下します。

CloudWatch_Metricfilter_goto_loggroup

ロググループの検索画面に遷移しました。ここではフィルターパターンも表示時間も入力済みのため、すぐにお目当てのログイベントを確認できます。

CloudWatch_Management_Console_CloudWatch_Logs_events

これを知らずに今まで手入力で頑張っていた自分としては、あまりの便利さに少し笑ってしまいました。

メトリクスフィルターによって発行されたものでないメトリクスでの「ログの表示」

冒頭で見たような [アクション]→[ログの表示] がリンクになっているものについてです。観測した範囲では「メトリクスフィルターによって発行されたものでないメトリクス」の場合はリンクになっているようでした。

CloudWatch_Management_Console_view_log-5383091

これを押すと……

どうなるんだ……!?

CloudWatch_Management_Console

ロググループ一覧のページに飛ばされます。それだけでした。

もともとそういった挙動が想定されているのか、わたしの環境では(設定が足りないなどで)そうなるだけなのかは不明ですが、ともかくそういった挙動でした。

通常のメトリクスにおける「ログ」ってなんだ?と考えると思い浮かぶものがないので、「ログを表示」はメトリクスフィルター専用の機能なのかな、と思ったりしています。

AWS ドキュメントなどでの正式な記述は見つけられなかったので、このあたりの情報をお持ちの方がいたら教えていただけると幸いです。

終わりに

CloudWatch Logs メトリクスフィルターにより発行されたメトリクスの画面から「ログの表示」を押して大元のログイベントを手軽に検索する、という話でした。

旧コンソールでもボタンが用意されているので以前から使えた機能だとは思うのですが、わたしはまったく気づいていませんでした。同僚がチャットで取り上げているのを見て知ることができました。感謝です。

同じように「検索がちょっと手間だな〜」と思っていた方の参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。

脚注

  1. 厳密に言うと3件かどうかはこの画像からだけでは読み取れません。フィルターパターンに合致した場合に発行する値は自由に設定できるからです。でも大抵の場合「1」を設定するでしょう。してください。