All Your Bugs Are Belong To Ass

Docker + nginx + td-agent + bigqueryで構築するログ集計機能付きhttp-proxy

絶賛Docker期まっ只中のytnobodyです。

さて今日は、当ブログの分析を下支えしてくれているGoogle BigQueryに纏わる話題です。

コンテナは立てた。アクセスログは、どうする?

基本的にコンテナのストレージ空間(って表現は微妙?)は揮発的で、一旦コンテナを削除したら、当然ですけどコンテナの中に入れていたファイルたちは全部消滅します。当然nginxのアクセスログなんかもそうです。そんなわけで、どこかにログを逃しておかないと、後々の分析や調査に利用できないわけですね。

そこで、ログ転送装置であるところのtd-agent(いわゆるfluentd)を使って、ログをBigQueryに蓄積していくことにしました。

「でも、手順が煩雑なんでしょ?」

というようなことを全部受け持ってくれるDocker imageを作りました。→ytnobody/docker-nginx-bigquery

このエントリでは、docker-nginx-bigqueryをdocker runする所まで大まかに解説していきます。

ちなみにコンテナのシステムtimezoneはJSTに変更済みです。

予めやっておく必要のあること

とりあえずGoogle Cloud Platfolmを利用開始しておきましょう。そして、プロジェクトを1つ作っておくと良いです。

あと、プロジェクトでBigQueryを利用できるようにしておきましょう。

そして、gcloudとbqコマンドを使えるようにしておきましょう。ついでに適切な名称のデータセットも用意しておいてください。

ログを貯めこむテーブルを作る

手始めに、以下のような内容でschema.jsonというファイルを作りましょう。

[
  { "name": "time",    "type": "timestamp" },
  { "name": "remote",  "type": "string"  },
  { "name": "host",    "type": "string"  },
  { "name": "user",    "type": "string"  },
  { "name": "method",  "type": "string"  },
  { "name": "path",    "type": "string"  },
  { "name": "code",    "type": "integer" },
  { "name": "size",    "type": "integer" },
  { "name": "referer", "type": "string" },
  { "name": "agent",   "type": "string" }
]

そんでもって、以下のようなコマンドを実行しましょう。

$ bq mk -t your-project-id:your-dataset.access_log schema.json

これでテーブルが出来ました。

td-agentがBigQueryにアクセスするための秘密鍵を手に入れる

Google Developers Consoleで、OAuth Private Keyを作成しましょう・・・とはいえ、僕ここの解説するのメンドクサイんで、googleのドキュメント見ながら鍵を入手してください(無責任

なんとか.p12 というファイルが秘密鍵なので、頑張って入手してくださいね(ほんと無責任

設定や秘密鍵を閉じ込めたプライベートなgitレポジトリを用意する

以下のような構造のgitレポジトリを用意し、bitbucketあたりのプライベートなレポジトリに入れておきましょう。

./
├── bigquery-key.p12 (OAuth client private key for GCE / fixed filename)
├── bigquery.rc (Specify environment values / fixed filename)
└── nginx
    └── *.conf (virtual host configuration)

ざっくり解説しますね。

./bigquery-key.p12というのが、さっき作ってもらったGCEの秘密鍵です。ファイル名を書き換えて、これと全く同じ名前にしてください。

./nginx/*.confには、nginxのバーチャルホストの設定を置いといてください。

./bigquery.rcというのは、環境変数設定スクリプトだと思ってください。内容は以下のようなものとしてください。

export BIGQUERY_EMAIL=xxxxxxxxxx@developer.gserviceaccount.com
export BIGQUERY_PROJECT=your-projectid-123
export BIGQUERY_DATASET=your-dataset
export BIGQUERY_TABLE=access_log

BIGQUERY_EMAILには、秘密鍵に付与されるメールアドレスを、BIGQUERY_PROJECT,BIGQUERY_DATASET,BIGQUERY_TABLEにはそれぞれ、GCPのプロジェクトID,データセット名,テーブル名を設定してください。

ここまで出来たら、忘れずにgit pushしておきましょう。

コンテナを起こす

以下のようなコマンドでコンテナを起こしてみましょう。(適切なプライベートレポジトリURLを指定してくださいね?)

$ docker run \
  -e CONF_REPO=https://username:password@gitdomain/path/to/YourPrivRepo.git \
  -p 80:80 \
  -d ytnobody/docker-nginx-bigquery

あとは適宜リクエストを投げ込んであげると、大体5分位でBigQueryにアクセスログが投げ込まれます。

これでログ解析を雑に実施できますね!

BigQueryを2週間ほどつかってみた感想

基本的に不満らしい不満はそこまでないんですけど、時折Google側のAPIが500返すせいで、ログがうまく投げ込めないケースがあったりしますね。今回のコンテナにはリトライする設定をtd-agent.confに仕込んであるのですが、それでも取りこぼしはわずかに発生しているように見受けられます。

どうしても1件もログを落としたくない方は、別途対策が必要かと思います。あくまで「雑にログ解析する」用途だと認識しておくとハッピーになれるんじゃないでしょうか。

追記

bigquery側の取りこぼしの件、改めてログ件数数え直したりしてみましたけど(弱小ブログだからできる)、結果としては「取りこぼしていない」というところに落ち着きそうです。

という状況です。

Created at
by
ytnobody
Last modified at
2014-11-11 02:46
by
ytnobody