AWS GlueのクローラーでApache HTTP Serverのアクセスログ読み取り用のAmazon Athenaテーブルを作成する

AWS GlueのクローラーでApache HTTP Serverのアクセスログ読み取り用のAmazon Athenaテーブルを作成する

AWS GlueのクローラーでApache HTTP Serverのアクセスログを分析するためのテーブル作成例を試しました。カスタム分類子でGrokパターンを定義した版も試してみました。
Clock Icon2025.02.03

データ事業本部 機械学習チームの鈴木です。

先日メンバーからApache HTTP ServerのアクセスログをAmazon Athenaで読み込めるようにしたいとご相談頂いて、AWS Glueのクローラーを使うとどうかという話をしたのですが、私自身がクローラーをあまり使ってこなかったので良い機会と思い試してみました。

Glueクローラーによるアクセスログ向けテーブルの作成

AWS Glueでは組み込みのGrokパターンを使ったテーブル作成がサポートされています。
そのため、このパターンに合うアクセスログであれば、S3においてクローラーを実行するだけでテーブルを作成することができます。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/custom-classifier.html#classifier-builtin-patterns

上記ガイドによると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などを使ったテーブルを自分で作成して読み取りに使うこともできます。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/querying-apache-logs.html

やってみた

0. データの準備

Apacheの以下のガイドよりサンプルのログをファイルに保存してS3にアップロードしました。

https://httpd.apache.org/docs/2.4/en/logs.html

ログの内容は以下を用意しました。

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ロールはこだわりがなければコンソール上で簡単に作成することができます。

クローラーが使うIAMロール

作成されたテーブルが分かるようプレフィクスをつけて出力を設定し、クローラーを作成します。

出力の設定

Run crawlerを押してクローラーを実行し、成功することを確認しました。

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パターンはログフォーマットを元に作成しました。ログフォーマットはサーバーを管理している担当者に依頼して共有してもらうようにするとよいでしょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.