LoginSignup
5
5

More than 5 years have passed since last update.

アクセスログ集計環境の選定

Last updated at Posted at 2016-05-20

概要

とあるWebサービスのアクセスログの集計をどうするか、という話です。

やりたいこと

一日毎に、アクセスログを対象に集計を行いたい。

必須条件

  • 漏れなく、ダブりなくログが集計できること
  • 安心、安全にログが集計できる環境であること
  • なるべく楽をすること
  • ログサイズが大きくなっても問題なく対応できること

現在の状況整理

  • 集計対象になり得るログ
    • リクエストURLが取得できるログなら何でもOKなので、ELB、Apacheログあたりか。
  • 一日のログサイズ
    • Apacheログ:約3GB。ELBも同じくらい。

IMG_0119.JPG

調査

Saasのログサービスを見てみる

ポイントは、

  • 値段 (お金は無限ではない...)
  • API (ログを検索または集計するAPIがないと話にならない)

LogEntries

値段はお手頃だし、様々なログのインポート方法に対応しているが、
ログを検索するAPIのクエリが乏しい。
集計対象のログは、前日のログなのだが、パラメータで指定するtimestampはログのtimestampではなく、ログをインポートした時刻なので、ログのインポートに時差がある場合は、前日のログを検索で絞りこむことが出来ない。
不便そうなので見送る。

PaperTrail

実際にFreeプランを利用してみた。
Freeプランは100MB/monthで、2日間のログ検索期間がつく。
ログをインポートする方法はとても簡単だし、指定したログがあったらアラートを飛ばしてくれるし、
実業務ではなく、個人でサービスを作って運用しているレベルならめちゃくちゃ使える。
ただ、今回のログサイズからすると、料金が高すぎる。
250GB/monthで3日間のログ検索期間を設けるとすると、$585もする!

Loggly

こちらもFreeプランに登録して動かしてみたが、
動きが・・・遅い・・・・・一個一個のアクセスに・・・・時間・・かかりすぎ・・・・・・
値段はまあまあだが、なんだか信用できなくなってしまった。
今回は見送る。

NewRelic

ログの解析・集計というよりも、アプリケーションモニタリングなので、今回は見送る。

SumoLogic

肝心のsearchAPIなのだが、Enterpriseプランのみ利用可能。→Enterpriseプランはいくらかな?→「contact sales」
ハードルが高いので今回は見送る。

仕方ない、他の方法を考えよう

EC2でログを集計するスクリプトを動かす

実は、アクセスログを(日本時間での)一日分にマージしたファイルを、S3に置くというスクリプトをdailyで回している。
生成されたファイルをS3から取得→集計→DBにインポートするスクリプトを、上記のスクリプトが置いてあるEC2でdailyでクーロン実行する方法が考えられる。
では、そこで生まれる懸念点を洗い出そう。

  • EC2が落ちないかどうか不安
    • →EC2の監視
  • クーロンがちゃんと実行されるか不安
    • →クーロンの監視
  • ログを一日分にマージするスクリプトにエラーが起きないか不安
    • →スクリプトのエラー監視
  • ログ集計を行うスクリプトにエラーが起きないか不安
    • →スクリプトのエラー監視

「安心安全」という言葉がつくと、コードの実装だけではなく監視がまとわりついてくる。
なおかつ監視しているだけではダメで、リトライを行わせたりすることを考えると、自分たちで実装する部分が多くなってしまう。
なるべく監視が少なくすむ方法を、もう少し考える。

lambda経由でELBログをElasticSearchにインポートする

  • lambdaの処理が5分で終わるか不安
    • ElasticSearchのbulkAPIを利用すれば、ログのインポートは早くなる。1ファイル1MB ~ 2MBの場合なら10 ~ 15秒程で処理が終わるらしい。要件証。
  • S3からElasticsearchにログをインポートするlambda関数にエラーが起きないか不安
    • →lambdaのエラー監視
  • Elasticsearchの容量オーバーでログがインポートされなくなってしまう不安
    • cloudwatchのアラート監視

1つめは、検証結果次第では不安はなくなる。
2つめは、lambdaのログを見れるcloudwatchが大変見づらいので、エラー監視でエラー内容を素早くチェックできるかが肝。
3つめは、ElasticSearchのFree Strage Space(うろ覚え)を、あるしきい値でアラート設定すればOK。また、SNSとlambdaを利用して、自動でElasticSearchのストレージをアップすることができれば、アラートに気づかないという不安を解消できる。

さっきよりもぐっと、監視の数を減らすことができた。
lambdaでELBログをElasticSearchにインポートする事例は、ネット上で沢山転がっているし実現性があるだろう。

fluentdを利用してEC2のApacheログをElasticSearchにインポートする

  • fluentdが落ちないか不安
    • →fluentdの監視
  • Elasticsearchの容量オーバーでログがインポートされなくなってしまう不安
    • →cloudwatchのアラート監視

1つめは、mackerelの監視を付ければ簡単にslack等にアラートをながせる。実際に落ちた時は、すぐに立ち上げるという方法しか今のところ取れないが・・・。
2つめは、上と同じなので割愛する。

決定

もう一度、要件を復習する。

  • 漏れなく、ダブりなくログが集計できること
  • 安心、安全にログが集計できる環境であること
  • なるべく楽をすること
  • ログサイズが大きくなっても問題なく対応できること

Saas系のログサービスを利用したログ集計の構築については、今回は要件に合わなかったので全て見送った。
以下の3つが候補に残ったわけだが、

  • EC2でログを集計するスクリプトを動かす
  • lambda経由でELBログをElasticSearchにインポートする
  • fluentdを利用してEC2のApacheログをElasticSearchにインポートする

最低限の要件は満たせている中で、一番「楽」ができそうなのが「fluentdを利用してEC2のApacheログをElasticSearchにインポートする」だと考える。

選定理由は、fluentdの安定感と、監視をmackerelにお任せできて、なおかつ設定が楽そうだという点だ。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5