AWS WAFログをAthenaで分析する環境をGlueクローラを使って構築してみる
AWS WAFのログをAthenaで分析するための環境(Glueデータカタログ)をGlueクローラを使って構築してみたので、そのやり方を紹介します。
AWS WAFのログをAthenaで分析する方法は、弊社のブログで公開されています。
どちらもAthenaのテーブル(Glueデータカタログ)を CREATE TABLE で構築しているので、本ブログでは Glueクローラ に焦点を当て、Glueクローラを使ってテーブルを構築する方法を紹介します。
Glueクローラで作ると何がうれしいのか?
AWS WAFのログであれば、すでに前述のブログでAWS WAFのログ形式に合わせたテーブルメタデータのCREATE TABLE文が前述のブログで公開されているので、そちらを利用したほうが正確で、Glueクローラを利用する意味はあまりありません。
Glueクローラは、保存されているデータからテーブル構造を推測してテーブルメタデータ(Glueデータカタログ)を作ってくれます。 よって、CREATE TABLE文が用意されておらず、 自分でテーブルメタデータを定義する必要があるログデータをAthenaで分析したい 、 0からテーブルメタデータを作らなければいけない といった場合に、知っておくと有用です。
Glueクローラの推測が正確でない場合もありますが、GlueクローラにGlueデータカタログを作ってもらった後に、間違えている部分を手で修正するほうが、0からGlueデータカタログを作るよりも楽にGlueデータカタログを構築できると思います。
構成図
構成は次の図のとおりです。
- CloudFront + S3 のWebサーバーを構築します
- WAFをCloudFrontに関連付けます
- Glueクローラを使ってWAFログのテーブルメタデータ(Glueデータカタログ)を作成します
- AthenaでWAFログの分析を行います
本ブログでは、Glueクローラを使ってWAFログのテーブルメタデータ(Glueデータカタログ)を作る方法を紹介します。
前提条件
次のようなCloudFrontにWAFを関連付けて、WAFのログを出力するまでの環境は構築済みであることを前提とします。
- CloudFront + S3の静的Webサーバー
- WAFとCLoudFrontの関連付け
- WAFのログをKinesis Firehoseを通してS3に出力
Glueクローラの構築
クローラの名前を適当につけて次へ進みます。今回は、aws-waf-log-crawlerという名前にします。
source typeは Data stores を選択します。
データストアの選択は S3 を選択し、インクルードパスにはAWS WAFのログを保存しているS3を選択します。
別のデータストアは追加する必要は無いので、 いいえ を選んで次へ進みます。
IAMロールは適当な名前をつけて新しく作成します。今回は、AWSGlueServiceRole-waflogという名前にします。
クローラのスケジュールは オンデマンドで実行 を選択します。
クローラの出力先は、データベースを新しく追加したいので データベースの追加 をクリックします。
データベース名は適当な名前をつけて作成します。今回は、aws-waf-logという名前にします。
データベースが作成できたら、次へ進みます。
最後に設定値を確認して、Glueクローラの追加を完了します。
Glueクローラの実行
作成したGlueクローラは、次のようにしてクローラの実行ができます。 実行完了まで数分かかるので待ちます。
Glueクローラの実行が完了すると、aws-waf-logデータベースに新しいテーブルが追加されており、Glueクローラがテーブル構造を読み取ってテーブルを構築してくれていることがわかります。
Glueデータカタログの修正
Glueクローラが作成したテーブルのスキーマを見てみると、おおむね良さそうなのですがパーティション部分の列名がうまく推測できていません。
これは、AWS WAFのログが YYYY/MM/dd/HH の接頭辞をつけて保存されており、カラム名なしでパーティションが分けられているため、列名が推測できていません。 そのため、自分で列名をつけてあげる必要があります。
ちなみに、S3のこの YYYY/MM/dd/HH の接頭辞はKinesis FirehoseでS3に出力する時のデフォルトの仕様です。
このパーティションに列名をつけるには、テーブルの編集画面からスキーマの編集を選択します。
そして列名をそれぞれ次のように変更してあげます。
- partition_0 → year
- partition_1 → month
- partition_2 → day
- partition_3 → hour
これでGlueデータカタログの構築が完了しました。
後は、AthenaでSQLクエリを実行することで、AWS WAFのログ分析ができます。
終わりに
AWS WAFログをAthenaで分析する環境をGlueクローラを使って構築してみました。
実際AWS WAFログの分析をするのであれば、すでに公開されているCREATE TABLE文を利用すればよいです。 異なる形式のログの分析をしたいなんて時には、テーブルメタデータ(Glueデータカタログ)の作成にGlueクローラを利用できるのではないかと思います。