fluentd Windows版でBigQueryする


##0. 前書き
![wfb.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/03ae97d2-5828-426d-fe09-939d6cf16132.jpeg)

BigQuery、楽しげですね！
けど、なんていうか、特にインプットのフェーズにおいて活用するとなるとWindowsワールドの住人、またはそこで暮らさざるを得ない人からはちょっと遠いところ感があって、利用しようと思った刹那、途端にナニソレオイシイノ？みたいな状況になっている人も少なからずいると思います。

そんな人達のために！
fluentd Windowsブランチを使ってお手軽BigQueryと行きましょう！
WindowsのイベントログをBigQueryにためこんでみます。
ということで目指す構成はこんな感じ。

* Windows Server 2012 日本語版
* Ruby 2.1
* fluentd Windows版
* fluent-plugin-winevtlog
* fluent-plugin-bigquery

![gaiyo.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/98eb4425-31e6-30d5-50f9-36c82465974e.jpeg)


ポイントは

* **fluent-plugin-bigqueryがWindowsでも動くっぽい！**

ところでしょう！**素晴らしい**。

なお、本記事の作成にあたっては以下の投稿を多いに参考にさせて頂きました。
[FluentdでGoogle BigQueryにログを挿入してクエリを実行する](FluentdでGoogle BigQueryにログを挿入してクエリを実行する)

##1. Google BigQueryの基本準備

![bigquery.jpeg](https://qiita-image-store.s3.amazonaws.com/0/31816/a09d533f-6bbd-5b8f-b862-96b1174e5039.jpeg)

BigQueryに送るのですから、何はともあれBibQueryは利用できるよにしておく必要があります。


BigQueryそのものの利用開始はこちらから。

[Google Cloud Platform BigQuery]
(https://cloud.google.com/bigquery/?hl=ja)

無料体験的なボタンから入っていて指示に従えばよいでしょう。

fluentdからの利用には、fluentdの導入先となるマシンに bq command line toolsとよばれるBigQueryのクライアントの導入が必要です。Windowsベースの記事は少ないのですが、以下のSIOS社のエントリがよくまとまっていると思います。一部誤字脱字がありますが、まぁこの通り問題無く作業できるでしょう。

[Google BigQuery - bq command編]
(http://sstd-bigdata.blogspot.jp/2013/07/google-bigquery-bq-command.html)

Windowsイベントログの回収元とする（fluentd Windows版を導入する）サーバーで作業してください。ここまでの作業により、以下の状況が達成できているはずです。

* Google BigQueryがAPIベースで利用可能
* Windowsイベントログを回収元とするサーバー内にbq command line toolsが導入済み
* 上記環境のbq command line toolsからBigQueryにアクセス可能

##2. BigQuery側にWindowsイベントログの受領先となるプロジェクトを作る
プロジェクトの作成はブラウザベースでちゃちゃっといきましょう。

Google Developer Consoleを開き、プロジェクト一覧画面から「プロジェクトを作成」をクリックします。
プロジェクト名はなんでもいいんですが、ここでは

```
win-fluentd-bq
```

とします。ここではプロジェクトIDも同じものとしwin-fluentd-bqとしておきます。

![winevtlog-project.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/9edcd5f8-fe8e-bccd-1fcf-129fadec2fe1.jpeg)

プロジェクトが作成できたらプロジェクト内でBigQuery APIの使用を許可します。画面左側のAPI欄を選択して表示される画面で有効化してください。画面はしょりますが特段問題ないでしょう。
![win-fluentd-qb-api.jgp.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/c9f24f22-98b5-9f8c-2066-392df4b81469.jpeg)


次にデータセットを作ります。bq command line clinetからいきます。コマンドプロンプトを起動して、以下のようにタイプします。データセット名はserverlogとしておきましょう。

```
>bq mk win-fluentd-bq:serverlog
Dataset 'win-fluentd-bq:serverlog' successfully created.

```


次はテーブルを作ります。BigQueryのテーブルはスキーマが必要ですので、事前にjson形式で作成しておいて、bqコマンドでテーブル作成時にそのファイルを指定する形を取ります。
以下のようなファイルを作り、c:\fluentd\schema\winevtlog.jsonとして保存ておきましょう。

```:C：\fluentd\schema\winevtlog.json
[
  {
    "name":"channel",
    "type":"STRING"
  },
  {
    "name":"record_number",
    "type":"INTEGER"
  },
  {
    "name":"time_generated",
    "type":"STRING"
  },
  {
    "name":"time_written",
    "type":"STRING"
  },
  {
    "name":"event_id",
    "type":"INTEGER"
  },
  {
    "name":"event_type",
    "type":"STRING"
  },
  {
    "name":"event_category",
    "type":"STRING"
  },
  {
    "name":"source_name",
    "type":"STRING"
  },
  {
    "name":"computer_name",
    "type":"STRING"
  },
  {
    "name":"user",
    "type":"STRING"
  },
  {
    "name":"description",
    "type":"STRING"
  }
]

```

このスキーマはこの後インストールするfluent-plugin-winevtlogにあわせてありますので、いじらずにこのままで。
で、テーブル作成のコマンドを叩きます。テーブル名はwinevtlogとしておきましょう。
bq mk の最後の部分は上記で作成したスキーマ定義のjsonファイルを指定しています。

```
> c:
> cd \fluent
> bq mk win-fluentd-bq:serverlog.winevtlog ./schema/winevtlog.json
Table 'win-fluentd-bq:serverlog.winevtlog' successfully created.

```

ちゃんと作成されたか、ブラウザから確認してみましょう。
Google Devloper Consoleのwin-fluentd-bqプロジェクトビューからビッグデータ-BigQueryといってテーブルを確認します。

![schema_reslut.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/d249cd83-88cc-1a2d-fc9f-3825fcee964f.jpeg)

いいですね！

##3. 作成したGooble Cloud Plotformプロジェクトのサービスアカウントを取得する
上記で作成したwin-fluentd-bqプロジェクトを外部プログラムから利用する場合、そのためのサービスアカウントを作成し、そのサービスアカウントに紐づけられたメールアドレスとp12ファイルが必要となります。

記事 [FluentdでGoogle BigQueryにログを挿入してクエリを実行する](FluentdでGoogle BigQueryにログを挿入してクエリを実行する) の中程「FluentdからBigQueryにログを挿入する」-「認証キーを取得する」を参照し、メールアドレスを鍵ファイル（p12ファイル）を取得してください。
**取得したp12ファイルはC:\fluentフォルダに配置してください**

ここまでくれば、あとは普通にfluentdを導入するだけです。


##3. fluentd本体を導入する
![fluentd-notitle.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/0358db21-2453-5ce3-fa79-8d35f922b4a0.jpeg)

今回はWindows Server 2012 + Ruby 2.1の環境に導入します。
次の記事を参考にしてRuby 2.1およびfluentdを導入します。

[fluentd WindowsブランチをRuby 2.1上で動かす](http://qiita.com/okahashi117/items/a0b55ea24a6ef7b6582b)


##4. fluentdプラグインを入れる
今回（意図的に）いれるプラグインは3つです。

* fluent-plugin-winevtlog ... Windowsイベントログを回収するインプットプラグインです
* fluent-plugin-record-modifier ... コード変換に利用するフィルタプラグインです
* fluent-plugin-bigquery ... BigQueryへのアウトプットプラグインです

プラグイン開発者のrepeatedlyさん、tagomorisさんに感謝。
すべてgem installで行けます。コマンドプロンプトを叩いてください。

```
gem install fluent-plugin-winevtlog
gem install fluent-plugin-record-modifier
gem install fluent-plugin-bigquery
```

特に問題ないと思います。

と、いいたいところですが。
依存関係で導入するretriableというgemパッケージですが、バージョンが上がった際に下位互換性が失われておりretrialbe1の2.xのバージョンではうまく動かない場合があります。**もし「6. いざ！」で実行時エラーが出た場合は**、retriableをアンインストールし、バージョン指定で1.4.1系（1.4.1など）をインストールしてください。（この記事執筆時点でPRがでていてるのでおそらく皆様が試すときには解決されていると思います。もしエラーがでたら、で。）

fluent-plugin-winevtlogとfluent-plugin-record-modifierの関係についてはこちら（[Windowsイベントログをfluentdプラグインで集めてmongoDBに突っ込む]
(http://qiita.com/okahashi117/items/245d6cb68e6aa42c004a)）に記事あります。参考にしてください。

##5. fluentdの設定ファイルを書く
Windowsイベントログからは、Application, System, Security, Setupのログを回収するものとします。また、念のため、標準出力にも表示をおこなうようにしておきましょう。
以下のような設定ファイルを記述し、c:\fluent\fluent.confとして保管してください。

```C：\fluent\fluent.conf
<source>
  type winevtlog
  channel application,system,security,setup
  pos_file C:/fluent/winevtlog.pos
  tag winevt.raw
</source>

<match winevt.raw>
  type record_modifier
  tag winevt.filtered
  char_encoding Windows-31J:utf-8
</match>

<match winevt.filtered>
  type copy
  <store>
    type stdout
  </store>
  <store>
  type bigquery
  method insert
  auth_method private_key
  email <上記の「3. 作成した～」で取得したアドレスを入力>
  private_key_path ./<上記の「3. 作成した～」で取得したp12ファイル名を入力（ファイル名だけですよ！）>

  project win-fluentd-bq
  dataset serverlog
  table winevtlog

  schema_path ./schema/winevtlog.json
  </store>
</match>

```

##6. いざ！
![play-151523_1280.png](https://qiita-image-store.s3.amazonaws.com/0/31816/f2832a1e-8d2a-a03b-c267-d0fb27e8d102.png)

**必ず管理者権限を有するアカウントで**コマンドプロンプトを立ち上げ、以下のようにタイプします。fluentd-plugin-winevtlogにおけるsecurityおよびsetupログの収集には管理者権限が必須です。

```
> C:
> cd \fluent
> fluentd -c ./fluent.conf
2014-12-12 02:22:23 +0900 [info]: starting fluentd-0.10.46.win141021001
2014-12-12 02:22:23 +0900 [info]: is windows platform : true
2014-12-12 02:22:23 +0900 [info]: spawn command to main (windows) : C:/Ruby21-x64/bin/ruby.exe 'C:/Ruby21-x64/bin/fluent
d' -c ./fluent.conf -U 3672
2014-12-12 02:22:24 +0900 [info]: starting fluentd-0.10.46.win141021001
2014-12-12 02:22:24 +0900 [info]: is windows platform : true
2014-12-12 02:22:24 +0900 [info]: reading config file path="./fluent.winevtlog.conf"
2014-12-12 02:22:25 +0900 [info]: gem 'fluent-mixin-config-placeholders' version '0.3.0'
2014-12-12 02:22:25 +0900 [info]: gem 'fluent-mixin-plaintextformatter' version '0.2.6'
2014-12-12 02:22:25 +0900 [info]: gem 'fluent-plugin-bigquery' version '0.2.5'
2014-12-12 02:22:25 +0900 [info]: gem 'fluent-plugin-buffer-lightening' version '0.0.2'
2014-12-12 02:22:25 +0900 [info]: gem 'fluent-plugin-record-modifier' version '0.2.0'
2014-12-12 02:22:25 +0900 [info]: gem 'fluent-plugin-winevtlog' version '0.0.3'
2014-12-12 02:22:25 +0900 [info]: gem 'fluentd' version '0.10.46.win141021001'
2014-12-12 02:22:25 +0900 [info]: using configuration file: <ROOT>
  <source>
    type winevtlog
    channel application,system,security,setup
    pos_file C:/fluent/pos/winevtlog.ps
    tag winevt.raw
  </source>
  <match winevt.raw>
    type record_modifier
    tag winevt.filtered
    char_encoding Windows-31J:utf-8
  </match>
  <match winevt.filtered>
    type copy
    <store>
      type stdout
    </store>
    <store>
      type bigquery
      method insert
      auth_method private_key
      email <上記の「3. 作成した～」で取得したアドレス>
      private_key_path ./<上記の「3. 作成した～」で取得したp12ファイル名>
      project win-fluentd-bq
      dataset serverlog
      table winevtlog
      schema_path ./schema/winevtlog.json
    </store>
  </match>
</ROOT>
2014-12-12 02:22:25 +0900 [info]: adding source type="winevtlog"
2014-12-12 02:22:25 +0900 [info]: adding match pattern="winevt.raw" type="record_modifier"
2014-12-12 02:22:28 +0900 [info]: adding match pattern="winevt.filtered" type="copy"
```

はい、問題ないですね！

ではイベントがBigQueryに送られているか確認をしましょう。
とはいえ何がしかイベントの発生を待つ必要がありますので、1日くらいまっってみましょう。はい、待てないひとは

["Windowsイベントログをfluentdプラグインで集めてmongoDBに突っ込む"](http://qiita.com/okahashi117/items/245d6cb68e6aa42c004a)

の記事を参考に手打ちでイベント発生させます。

で、win-fluentd-bqプロジェクトのBigQueryのコンソールに移動してQueryを実行します。
queryはこんな感じになります。

```
SELECT * FROM [serverlog.winevtlog] ORDER BY time_generated DESC LIMIT 1000
```


次の画像は何日か動かしたQuery状態でのスクショ。

![ss1.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/7f5a01d7-29cb-39c4-8aab-369db7c9a578.jpeg)
![ss2.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/ff524d5a-3774-63cb-698b-18cc75a13c2a.jpeg)


いいんじゃないでしょうかね！



##7. その他
今回はデータとしてWindowsイベントログを使っておりますが、データはなんであれWindowsであってもfluentdを使うことでそのままBigQueryに放り込めるところは大きなポイントかと思います。
ご参考になれば。

おわり。