Fluentd+BigQueryをできるだけ簡単に、30分くらいで試せるDockerコンテナを作ったので、使い方を記しておく。tacke_jpさんもBQとTwitter API連携の例を書いていたけど、今回はnginxログをBQに投げる例をできるだけシンプルに作ってみた。GCPを使ったことないという人向けに$300分の無料体験プログラムも始まったので、お昼休みの合間にでも試してみてほしい。
手順は以下のとおり。
- BigQueryにサインアップ
- BQのデータセットとテーブルを作る
- Google Compute Engine (GCE)インスタンスを作る
- nginx+FluentdのDockerコンテナを動かす
- BQクエリでアクセスログを見る
BigQueryにサインアップ
(既存のGCPプロジェクトを使う場合はスキップ)
Google Developer Consoleで新規プロジェクト作成
これまでGoogle Cloud Platformを使ったことがないという人は、$300分の無償枠を利用できる。cloud.google.comを開き、無料体験版
をクリックし、ユーザー登録を行う。一方、これまでGCPを利用したことのある人は、Google Developer Consoleを直接開こう。
Create Project
ボタンをクリックすると、30秒ほどでプロジェクトが作成される。このサンプルではBQのテーブルを作成するので、課金登録が必要となる。作成したプロジェクトを選択し、Billing & settings
-Enable billing
を選択し、カード情報を入力する。無料体験版であれば、ユーザー登録時に入力したカード情報が適用されるが、$300分までは課金されることはない。
つづいて、左側のナビゲーションメニューからBig Data
- BigQuery
をクリックし、BigQueryブラウザツールを開く。COMPOSE QUERY
をクリックし、New Query
フィールドに以下のSQLを入力してRUN QUERY
をクリックする。
SELECT title FROM [publicdata:samples.wikipedia]
WHERE REGEXP_MATCH(title, r'.*Query.*')
LIMIT 100
これで結果が帰ってくれば、BQの動作確認はOK。
BQのデータセットとテーブルを作る
Google Cloud SDKをインストール後、以下のコマンドを実行してアカウント認証を済ませる。
$ gcloud auth login
つづいて以下のコマンドでBQのデータセット(テーブルをまとめる入れ物のようなもの)を作る。YOUR_PROJECT_ID
の部分は先ほど作成したプロジェクトのIDを指定する。
bq mk YOUR_PROJECT_ID:bq_test
次に、テーブルを作成するためのスキーマファイルschema.json
を以下の内容で用意する。
[
{
"name": "agent",
"type": "STRING"
},
{
"name": "code",
"type": "STRING"
},
{
"name": "host",
"type": "STRING"
},
{
"name": "method",
"type": "STRING"
},
{
"name": "path",
"type": "STRING"
},
{
"name": "referer",
"type": "STRING"
},
{
"name": "size",
"type": "INTEGER"
},
{
"name": "user",
"type": "STRING"
},
{
"name": "time",
"type": "INTEGER"
}
]
そして以下のコマンドを実行し、テーブルaccess_log
を作成。
$ bq mk -t YOUR_PROJECT_ID:bq_test.access_log ./schema.json
ブラウザツール画面をリロードし、テーブルが正しく作成されたことを確認する。
Google Compute Engineインスタンスの作成
GCEのサインアップ
(GCEを利用したことのある場合はスキップ)
Google Developer Consoleを開き、先ほど作成したプロジェクトを選択。APIs & auth
-APIs
をクリック。Google Compute Engine
をEnableに設定する。
GCEインスタンス作成
以下のコマンドを実行し、GCEインスタンスbq-test
を作成する。20秒〜30秒くらいで、Docker入りDebianイメージのGCEインスタンスがasia-east1-a
リージョンに作成される。
$ gcloud config set project YOUR_PROJECT_ID
$ gcloud compute instances create "bq-test" \
--zone "asia-east1-a" --machine-type "n1-standard-1" \
--network "default" --maintenance-policy "MIGRATE" \
--scopes "https://www.googleapis.com/auth/devstorage.read_only" \
"https://www.googleapis.com/auth/bigquery" \
--image container-vm-v20140929 --image-project google-containers
このおまじないの意味は、
-
bq-test
という名前のn1-standard-1
インスタンスをasia-east1-a
リージョンに作成 -
default
ネットワークに接続、ライブマイグレーションを有効に設定 - Metadata Serverで取得できるOAuth2アクセストークンのscopeをCloud StorageとBQに設定
- Docker入りのDebianイメージを利用
である。
nginx+FluentdのDockerコンテナを動かす
以下のコマンドでGCEインスタンスにsshする。
$ gcloud compute ssh bq-test --zone=asia-east1-a
GCEの中に入ったら、以下のコマンドでDockerコンテナを起動する。YOUR_PROJECT_ID
の部分は作成したプロジェクトのIDで置き換える。
$ sudo docker run -e GCP_PROJECT="YOUR_PROJECT_ID" -p 80:80 -t -i -d kazunori279/fluentd-bigquery-sample
Google Developer Consoleに戻り、Compute
-Compute Engine
-VM instances
を選択。bq-test
インスタンスを選択し、External IP
のリンクをクリックする。ダイアログが表示されたらAllow HTTP traffic
を選択してApply
をクリック。これで、ポート80番が外に向けて公開される。
Updating instance tags for "bq-test"
の処理が完了したら、External IP
のリンクを再度クリックする。今度はDockerコンテナ内で稼働するnginxに接続し、ブラウザ上にWelcome to nginx!
のメッセージが表示される。リロードボタンを何回か押してHTTPリクエストを送っておこう。
BQクエリでアクセスログを見る
BQブラウザツールを開き、COMPOSE QUERY
をクリックして以下のクエリを実行する。
SELECT * FROM [bq_test.access_log] LIMIT 1000
ただし、初回はアクセスログがBQに反映されるまで1分ほど時間がかかるかも。一度動き始めれば、nginxへのアクセスが数秒後にはBQクエリの結果にリアルタイムに反映されるのがわかる。これでお試し手順は完了。
Dockerfileとtd-agent.confの中身
このサンプルではあらかじめ構築済みのDockerイメージを使ったためにあっという間に構築が完了したが、Dockerfileを見れば構築手順の詳細がわかる。Ubuntuイメージを用意したのち、Fluentd、nginx、そしてfluent-plugin-bigqueryをそれぞれインストールしている。
FROM ubuntu:12.04
MAINTAINER kazunori279-at-gmail.com
# environment
ENV DEBIAN_FRONTEND noninteractive
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
# update, curl, sudo
RUN apt-get update && apt-get -y upgrade
RUN apt-get -y install curl
RUN apt-get install sudo
# fluentd
RUN curl -O http://packages.treasure-data.com/debian/RPM-GPG-KEY-td-agent && apt-key add RPM-GPG-KEY-td-agent && rm RPM-GPG-KEY-td-agent
RUN curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-precise-td-agent2.sh | sh
ADD td-agent.conf /etc/td-agent/td-agent.conf
# nginx
RUN apt-get install -y nginx
ADD nginx.conf /etc/nginx/nginx.conf
# fluent-plugin-bigquery
RUN /usr/sbin/td-agent-gem install fluent-plugin-bigquery --no-ri --no-rdoc -V
# start fluentd and nginx
EXPOSE 80
ENTRYPOINT /etc/init.d/td-agent restart && /etc/init.d/nginx start && /bin/bash
またtd-agent.confでは、Fluentdのログをfluent-plugin-bigqueryに流すための設定が記されている。以下のとおり、とても簡単だ。
<match nginx.access>
type bigquery
auth_method compute_engine
project "#{ENV['GCP_PROJECT']}"
dataset bq_test
tables access_log
time_format %s
time_field time
fetch_schema true
field_integer time
</match>
今回はBQのデータセットと同じプロジェクト内のGCEインスタンスからアクセスしているため、上記のようにauth_method compute_engine
と書くだけで認証設定は完了。BQプラグインがMetadata ServerからOAuth2アクセストークンを取得するので、自分で秘密鍵を作ってコピーしてうんぬんは不要だ。"#{ENV['GCP_PROJECT']}"
の部分は、Docker起動時の環境変数を通じてプロジェクトIDを受け取っているところ。
あとかたづけ
GCEインスタンスを立ち上げっぱなしにしておくと課金されてしまうので、以下のコマンドで削除しておこう。
gcloud compute instances delete bq-test --zone=asia-east1-a
またBQブラウザツールを開き、bq_test
データセットをドロップダウンメニューからDelete dataset
を選択して削除する。
以上、Fluentd+BigQueryお試し手順をまとめた。
2015.1.27 追記(Google Spreadsheet連携など)
この記事の英語版がGCP公式サイトに公開された。こちらにはさらにGoogle Spreadsheetとの連携についても手順が解説されてるのでお試しあれ。
Disclaimer この記事は個人的なものです。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には関係はありません。