AWS GlueのクローラーでApache HTTP Serverのアクセスログ読み取り用のAmazon Athenaテーブルを作成する
データ事業本部 機械学習チームの鈴木です。
先日メンバーからApache HTTP ServerのアクセスログをAmazon Athenaで読み込めるようにしたいとご相談頂いて、AWS Glueのクローラーを使うとどうかという話をしたのですが、私自身がクローラーをあまり使ってこなかったので良い機会と思い試してみました。
Glueクローラーによるアクセスログ向けテーブルの作成
AWS Glueでは組み込みのGrokパターンを使ったテーブル作成がサポートされています。
そのため、このパターンに合うアクセスログであれば、S3においてクローラーを実行するだけでテーブルを作成することができます。
上記ガイドによるとGrokパターンは以下の形式です。
COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{Bytes:bytes=%{NUMBER}|-})
COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}
なにかしらの理由で組み込みパターンに合わないログフォーマットになっていたり、テーブルのスキーマをカスタマイズしたい場合は、カスタム分類子を使って独自のGrokパターンなどを定義し、テーブルを定義することができます。
今回は簡単な例ですが上記2つの方法を試してみました。
なお、クローラーにこだわりがない場合はAthenaのcom.amazonaws.glue.serde.GrokSerDe
などを使ったテーブルを自分で作成して読み取りに使うこともできます。
やってみた
0. データの準備
Apacheの以下のガイドよりサンプルのログをファイルに保存してS3にアップロードしました。
ログの内容は以下を用意しました。
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
以下のようにS3にアップロードしました。
1. 組み込みパターンを使う例
組み込みパターンを使う場合は、AWS Glueのクローラーの画面より、Create Crawlerから新規にクローラーを作成するだけです。
データソースは今回S3を指定し、ログを配置したパスを指定しました。このとき、カスタム分類子は指定しません。
クローラーが使うIAMロールはこだわりがなければコンソール上で簡単に作成することができます。
作成されたテーブルが分かるようプレフィクスをつけて出力を設定し、クローラーを作成します。
Run crawlerを押してクローラーを実行し、成功することを確認しました。
Glueテーブルに指定したプレフィクスのテーブルができ、ログをAthenaから検索することができました。簡単ですね。
2. カスタム分類子を使う例
次にカスタム分類子を使う例です。
Apache HTTP Serverのアクセスログであれば、基本的には組み込みのパターンで対応できると思われますが、全く異なるログであったり組み込みパターンに合わないログフォーマットになっている場合のために設定方法を確認しました。
まずはGlueのコンソールより、新規にカスタム分類子を作成しました。
今回はGrokパターンを直に全てGrok pattern
の欄に設定しました。ブロックを定義したい場合はCustom patterns
に分けて記載することも可能のようです。
今回、Grok pattern
には以下の値を設定しました。
%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:-|%{NUMBER:bytes}) \"%{DATA:referrer}\" \"%{DATA:agent}\"
Grokパターンに詳しい方は厳密に定義して頂くのがよいのですが、あまり詳しくなくざっくりでよければ、サーバー担当者からログフォーマットをもらい、LLMに変換してもらうのが手っ取り早いです。この際、ログフォーマットと照らし合わせて今後入ってくるであろうログに対応できるパターンになっていることを十分にテストしましょう。
以下は変換の一例です。Claude 3.5 Sonnet v2で行いました。
Apache アクセスログフォーマットの"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""を、Grokパターンに変えてほしいです。
Apache アクセスログの一般的なフォーマットを Grok パターンに変換すると以下のようになります:
%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:-|%{NUMBER:bytes}) \"%{DATA:referrer}\" \"%{DATA:agent}\"
このパターンの各部分は以下に対応しています:
- %h → %{IPORHOST:clientip} (IPアドレスまたはホスト名)
- %l → %{USER:ident} (identd情報)
- %u → %{USER:auth} (認証ユーザー)
- %t → \[%{HTTPDATE:timestamp}\] (タイムスタンプ)
- \"%r\" → \"%{WORD:verb} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion}\" (リクエスト行)
- %>s → %{NUMBER:response} (ステータスコード)
- %b → (?:-|%{NUMBER:bytes}) (レスポンスサイズ。'-'の場合もある)
- \"%{Referer}i\" → \"%{DATA:referrer}\" (リファラー)
- \"%{User-agent}i\" → \"%{DATA:agent}\" (ユーザーエージェント)
カスタム識別子はクローラー作成時に指定しました。
ほかは同様にしてクローラーを作成し、実行するとテーブルが作成され、ログを検索することができました。
最後に
AWS Glueのクローラーを使ってApache HTTP Serverのアクセスログを分析するためのテーブルを作成する例をご紹介しました。合わせてカスタム分類子を使った方法も試してみました。Grokパターンはログフォーマットを元に作成しました。ログフォーマットはサーバーを管理している担当者に依頼して共有してもらうようにするとよいでしょう。