Fluentd＋BigQueryの$300無料体験版を30分で試す手順

Fluentd＋BigQueryをできるだけ簡単に、30分くらいで試せる[Dockerコンテナ](https://github.com/kazunori279/bigquery-fluentd-docker-sample)を作ったので、使い方を記しておく。tacke_jpさんも[BQとTwitter API連携の例](http://qiita.com/tacke_jp/items/3bd0a445e4fdba27569a)を書いていたけど、今回は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](cloud.google.com)を開き、`無料体験版`をクリックし、ユーザー登録を行う。一方、これまでGCPを利用したことのある人は、[Google Developer Console](https://console.developers.google.com/)を直接開こう。

`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](https://cloud.google.com/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](https://console.developers.google.com/)を開き、先ほど作成したプロジェクトを選択。`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](https://github.com/kazunori279/dockerfiles/blob/master/fluentd-bigquery-sample/Dockerfile)を見れば構築手順の詳細がわかる。Ubuntuイメージを用意したのち、Fluentd、nginx、そして[fluent-plugin-bigquery](https://github.com/kaizenplatform/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](https://github.com/kazunori279/dockerfiles/blob/master/fluentd-bigquery-sample/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連携など）

この記事の[英語版](https://cloud.google.com/solutions/real-time/fluentd-bigquery)がGCP公式サイトに公開された。こちらにはさらにGoogle Spreadsheetとの連携についても手順が解説されてるのでお試しあれ。

----
Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡