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側の取りこぼしの件、改めてログ件数数え直したりしてみましたけど(弱小ブログだからできる)、結果としては「取りこぼしていない」というところに落ち着きそうです。
例のbigqueryの件、だいたいbigquery側っぽいという切り分けはできたけど、もう少し定量観測して、記事を改めたい。
— あずまさとし@相模 (@ytnobody) November 10, 2014
とりあえずim.kayacにエラー流して生活してみよう
— あずまさとし@相模 (@ytnobody) November 10, 2014
たいてい 500 backend error が出ていて、適切にretryされていたし、僕が「取りこぼしてるように見受けられる」って書いた部分も、勘違いの可能性が濃厚だなぁ・・・
— あずまさとし@相模 (@ytnobody) November 10, 2014
という状況です。