こんにちは!カバーのアドベントカレンダーにて、先週記事を投稿させて頂きました。今回は AWS CLI でのログの閲覧についてもう少し書いてみたいと思います。
フィルタパターン・オプション
AWS CLI では、ログを取得するコマンドにフィルタパターンを指定する --filter-pattern オプションが用意されています。
aws logs tail ロググループ名 --follow --filter-pattern フィルタパターン
--filter-pattern オプションはいろいろな検索パターンに対応しています。grep と同様に正規表現でのパターンマッチングも行えますが、加えて JSON の要素を指定したマッチングや要素の値にワイルドカードや正規表現が使えたりなど、たいへん便利に使うことができます。
フィルタに指定できるパターン
フィルタパターンに指定できる構文は下記の通りです。
- 文字列
- 正規表現
- JSON
- スペース区切りのフィールド
これらのフィルタパターンについては、AWS の上記のドキュメントにまとまっています。で…それを元に全体的な解説をしようと思ったんですが、すべての構文を網羅すると記事が長くなりすぎます(というか多すぎて心折れました…)ので、今回は特に私自身がすごいと思ってしまったものをピックアップしていきたいと思います。![]()
JSON に対するフィルタパターン
ということで、今回は JSON フォーマットのログに対するフィルタパターンに絞っていこうと思います!といいますのも、私が日頃見ているのが JSON のログであるということと、単に要素の値を指定するだけではなく、正規表現や条件を複数指定できたりと、私が想像していたよりもいろいろな指定ができると知ってしまったからです。(他の構文については機会を改めてまとめるかもしれません…)
一致・不一致
まず、基本ですが…
{$.path="/api/v1/login"}
= 以外では、等しくない場合に != が、数値には <, >, <=, >= も使えます。
ワイルドカード
文字列のパターンにはワイルドカード * が使えます。
{$.IPAddress="192.168.0.*"}
!= を使用することで、マッチしないパターンも抽出できます。
正規表現
% で囲むことによって正規表現が使えます。
{$.status=%5[0-9]{2}%}
同じく != を使用することで、マッチしないパターンも抽出できます。
複合条件
&&, || を用いて条件の AND と OR を指定できます。
{$.user.name="foo" && $.user.email="foo@example.com"}
{$.user.id=1111 || $.user.id=2222}
JSON のフィルタパターンの詳細はこちらをご参照下さい。
フィルターパターンを使用した JSON ログイベントの語句の一致
注意点
コマンドラインで --filter-pattern を指定する際、フィルタパターンに " や &&, || など含まれている場合は、シェルのメタキャラクタとして解釈されないために \ を使ってエスケープするか、フィルタパターン全体を ' で括る必要があります。
例えば、フィルタパターンに {$.path="/api/v1/login"} と指定した場合、エスケープし忘れるとエラーが返ってくる場合があります。(使用しているシェルによって大丈夫な場合もあります…)
An error occurred (InvalidParameterException) when calling the FilterLogEvents operation: Invalid character(s) in term '/'
この場合は、{$.path=\"/api/v1/login\"} と指定するとフィルタパターンを正しく aws コマンドに渡すことができます。
まとめ
今回は AWS CLI におけるログのフィルタリングについて書いてみました。
tail しつつ結果を検索したい場合はこちらの記事もどうぞ!