fluentdを使ってnginxのlogをAmazon Kinesisに投げ、Amazon Lambdaで処理してみました(上編)

初めまして、システムデザイン部開発ユニットのソンです。

九ヶ月前にME入社してから初の投稿になりますが、よろしくお願いします。

 

今回はnginxのlogについて紹介したいと思います。

今のビッグデータの時代にlogは各会社にとって大事なデータですよね。

サーバーにあまり負荷をかけずにlogを解析したいですね。

 

さて始めましょうか!

↑全体的なフローです。

Nginxをインストールし設定をしてlogファイルを書き出す。そしてfluentdがそのファイルを読みlogを抽出してKinesisに投入します。最後はkinesis投入のイベントが順番にLambdaを呼び、Lambdaで書いたコードでlogを処理します。

上編はログファイルを出すまで紹介します。

 

 

Nginxをインストールする(https://nginx.org/en/docs/install.html)と

サーバーの設定は/usr/local/nginx/conf/nginx.confになります

「log_format」はlogを出力する際に使用するフォーマットです。

デフォルトは以下のようになります。

各パラメータを説明していきます。

$remote_addr:クライアントのIPアドレス

$remote_user:クライアントのユーザー名

$time_local:アクセス日時

$request:httpの要求URI

$status:httpのステータス

$body_bytes_sent:送信バイト数

$http_referer:リファラーURL

$http_user_agent:ユーザエージェント情報

このセッティングファイルにはいろいろなディレクティブ(http://nginx.org/en/docs/dirindex.html)があります。

一般的にはhttpディレクティブの中にserverディレクティブを書きます。

今回はlogを出したいserverディレクティブの中にlogファイルのパスを設定します。

設定を保存すると、有効化させるためにNginxをリロードしないといけないです。

$ sudo service nginx reload

そうすると、サーバーにアクセルが来る時に、

/var/log/nginx/access-default.logにlogが書かれます。

今の設定では、URL、httpのステータスくらいしかわからないので、

解析できるデータは足りないですよね。

もしリクエストとレスポンス情報もあれば役に立てるかもしれません。

リクエストの情報は簡単に設定できますが、

レスポンスの情報量は大きい場合がありますので、基本的な設定上は出せません。

まずはリクエストの設定をしましょう。

同じくnginx.confを保存してnginxをリロードすれば、リクエストの情報が出ているはずです。

 

そして、レスポンスの情報を出す方法を紹介します。

レスポンスボディを出すために、Lua言語を使うlua-nginx-moduleを追加する必要があります。

Luaとはなんですか?

Luaはポルトガル語で「月」を意味するスクリプト言語です。

Windows、Mac OS X、Linuxなどの複数のOS上で動作できます。

詳しくは公式サイトご覧ください。

 

ライブラリーをインストールして、nginxをリビルトしリスタートするのはlua-nginx-moduleの追加の流れです。

nginxのソースコードのディレクトリーに(バーションによってパスが違います)

必要なものを入れます

モジュールをクローンします

ビルドします

リスタートします

そうすると、nginxのnginx.confはLuaを書けるようになりました。

 

そして、nginx.confを書き直してレスポンスボディを出します。

string.sub(ngx.arg[1], 1, 1000)の1000はレスポンスボディを出す文字数の上限です。適度な数値に変更してください。

リロードすればレスポンスボディも出ているはずです。

 

もし画像や動画などファイルのリクエストのアクセスが多い場合、logファイルはえげつなく肥大化します。

解決方法としては正規表現で不要なURLを排除し、必要なアクセスだけレスポンスボディを出します。

nginx.confを修正します。

そうすればurlに.mp3.pngが含まれているリクエストはレスポンスボディが出ません。

他にcontent-typeで判断することも可能です。

 

上編は以上になります。