Norikraを触ってみた


## はじめに
前々から気になっていた[norikra](https://github.com/norikra/norikra)を弄る時間ができたので弄ってみました。
インストールしてnginxのログをfluentd経由でnorikraに入れるところまでを記載しておきます。

norikraとは！？という質問には触り始めなのであんまりわかっていないですが、個人的には以下が特徴だと思っています。

* JSON形式のデータをリアルタイムで処理をするOSS
* SQLライクな記述で取得するデータを選択可能
* JRubyで記述されている
* GUIがある

以下参考にさせて頂きました。

* [Norikra+FluentdでDoS攻撃をブロックする仕組みを作ってみた](http://dev.classmethod.jp/cloud/aws/block_dos_attack_by_norikra/)


## 今回の構成

```
Nginx(fluentd)サーバー<->Norikraサーバー
```

の二台構成。

## 環境情報

* Nginxサーバー

```
・OS: Ubuntu14.04
・Nginx: nginx/1.4.6
・Ruby: ruby 2.1.5
・fluentd: 0.10.57
```

* Norikraサーバー

```
・OS: Ubuntu14.04
・Ruby: jruby-1.7.16.1
・Norikra: 1.1.1
```

## Step1: Rbenvのインストール(Nginxサーバー, Norikraサーバー)

まずはRbenvをインストールします。

```rbenv準備
$ sudo groupadd -g 1001 rbenv # Rbenv利用グループ
$ sudo groupadd -g 1002 norikra # Norikra利用グループ
$ sudo usermod -G rbenv,norikra ${username}
$ sudo apt-get update
$ sudo apt-get install gcc make openssl libssl-dev git openjdk-7-jre g++ ruby-dev
$ cd /opt
$ sudo git clone git://github.com/sstephenson/rbenv.git
$ sudo mkdir -p /opt/rbenv/shims /opt/rbenv/versions
$ sudo chgrp -R rbenv rbenv
$ sudo git clone git://github.com/sstephenson/ruby-build.git /opt/rbenv/ruby-build
$ cd /opt/rbenv/ruby-build
$ sudo ./install.sh
```

```/etc/profile.d/rbenv.sh
export RBENV_ROOT="/opt/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

```設定読み込み
$ source /etc/profile.d/rbenv.sh
$ rbenv --version
rbenv 0.4.0-129-g7e0e85b
$
```

さてこれでrbenvが使えるようになりました。

## Step2: JRubyのインストール（Norikraサーバー）

JRubyをインストールします。


```JRubyのインストール
$ rbenv install --list
  jruby-1.7.14
  jruby-1.7.15
  jruby-1.7.16
  jruby-1.7.16.1
  jruby-9.0.0.0-dev
  jruby-9.0.0.0+graal-dev
  jruby-9000-dev
  jruby-9000+graal-dev
  maglev-1.0.0
$ # 最新版の安定版をインストールします。
$ sudo env RBENV_ROOT=$RBENV_ROOT PATH=$PATH rbenv install -v jruby-1.7.16.1
$ rbenv global jruby-1.7.16.1
$ ruby --version
jruby 1.7.16.1 (1.9.3p392) 2014-10-28 4e93f31 on OpenJDK 64-Bit Server VM 1.7.0_65-b32 +jit [linux-amd64]
$
```

## Step3: Norikraインストール(Norikraサーバー)

```norikraインストール
$ gem install norikra --no-ri --no-rd
```

## Step4: Norikra起動(Norikraサーバー)

```ディレクトリの作成
$ sudo mkdir -p /var/log/norikra /etc/norikra /var/run/norikra
$ sudo chgrp norikra /var/log/norikra /etc/norikra /var/run/norikra
```

```起動
$ norikra start -d -l /var/log/norikra
```

正常にインストールできてれば`http://${norikra_server}:26578`でnorikraのConsole画面にアクセスできます。


![norikra_1.png](https://qiita-image-store.s3.amazonaws.com/0/46472/364462ca-489e-8233-8448-71621e8d19c7.png "norikra_1.png")

## Step5: Nginx, Ruby, Fluentdのインストール(Nginxサーバー)

```Nginxのインストール
$ sudo apt-get install nginx
```

```Ruby2.1.5インストール
$ rbenv install --list
  2.1.0
  2.1.1
  2.1.2
  2.1.3
  2.1.4
  2.1.5
  2.2.0-dev
  2.2.0-preview1
  2.2.0-preview2
$ sudo env RBENV_ROOT=$RBENV_ROOT PATH=$PATH rbenv install -v 2.1.5
$ rbenv global 2.1.5
$ ruby --version
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
$
```

```fluentdのインストール
$ sudo env PATH=$PATH gem install fluentd
$ sudo env PATH=$PATH fluent-gem install fluent-plugin-norikra --no-ri --no-rdoc # Norikraのプラグインインストール
$ sudo env PATH=$PATH fluentd --setup /etc/fluent # Configファイルなどの作成
```

## Step6: Fluentd設定(Nginxサーバー)
Step5で作成したfluentdの設定ファイルを編集してNginxのログがnorikraに飛ぶように設定します。

```posファイル用ディレクトリ作成
$ sudo mkdir -p /var/log/fluent
$ sudo chmod +x /var/log/fluent
```

```/etc/fluent/fluent.conf
# Tailing the Nginx Log
<source>
  type tail
  path /var/log/nginx/access.log
  pos_file /var/log/fluent/nginx-access.pos
  tag norikra.nginx
  format nginx
</source>
<match norikra.*>
  type norikra
  norikra ${norikra_server}:26571
  remove_tag_prefix norikra
  target_map_tag    true
</match>
```

```fluentdの起動
$ sudo env PATH=$PATH fluentd -c /etc/fluent/fluent.conf -vv &
```

## Step7: アクセスしてみる - 1(Nginxサーバー)
以下のコマンドでNginxにアクセスしてみます。

```curl
$ curl http://localhost
```

## Step8: 確認する/クエリの設定 - 1(Norikraサーバー)
Norikraサーバーでアクセスを確認してみます。
設定が正常に完了していたら、`Target=nginx`が自動で作成されていることがわかると思います。
Nginxログの各種fieldも自動で設定されています。

![norikra_2.png](https://qiita-image-store.s3.amazonaws.com/0/46472/104703b7-c2d2-d42d-0299-1c3c47656f07.png "norikra_2.png")

ただし、今の設定では取得したデータに対するクエリを指定していませんので送られてきたデータに対して何もしません。

Consoleでクエリを設定して、送られてきたデータを表示させてみます。せっかくなのでResponseコードが200以外のデータだけを引っかけるクエリを指定してみます。

![norikra_3.png](https://qiita-image-store.s3.amazonaws.com/0/46472/0594d257-8e59-d12d-e728-e4477f0bbc62.png "norikra_3.png")

私の環境では*を指定するとエラーが出たのでここではカラムを個別に指定しています。

## Step9: アクセスしてみる - 2(Nginxサーバー)

以下のコマンドでNginxにアクセスします。
ここでは200OK以外のレスポンスを得たいので存在しないパスを指定します。

```curl
$ curl http://localhost
$ curl http://localhost
$ curl http://localhost/no_content/
```

## Step10: 確認してみる - 2(Norikraサーバー)
もう一度NorikraのConsoleにアクセスしてみます。

三回アクセスしましたが、eventは一回しか発生していないことがわかります。

![norikra_4.png](https://qiita-image-store.s3.amazonaws.com/0/46472/0fee72d5-3886-488e-2027-1fc377ac5775.png "norikra_4.png")

`404 Not Found`のレスポンスが発生していることがわかります。

![norikra_5.png](https://qiita-image-store.s3.amazonaws.com/0/46472/72c2fe6c-fd6b-c573-38a8-0621058b9756.png "norikra_5.png")

## おわりに
まだ触り始めなので理解が不十分だと思いますが、norikraを利用することでSQLライクの方法でイベントを定義でき、イベントとアクションを紐付けることで色々と簡単に自動化ができるのかな思いました。

これを一段発展させ何かしらのシステムを作りたいですね^^

おしまい。