Windows7上にfluentd+Elasticserch+kibanaでLog収集テスト環境を構築したときのメモ

JenkinsのBuild情報を収集・解析するのにfluentd,Elasitcserach,kibanaでログ収集するPlatformのお試し環境を立ち上げたときのメモ。

# 前提条件
- [git for winsows](https://git-for-windows.github.io/)がインストールされていること。
- [cURL](http://curl.haxx.se/)がインストールされていること。(2016/05/22はアクセスタイムアウトしていた。)
- [VirtualBox](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp#vbox)がインストールされていること。(installしただけではだめでBIOSでVT-x/AMD-Vを有効化しておくこと。)
- [Vagrant](https://www.vagrantup.com/downloads.html)がインストールされていること。

# 環境
|環境等|バージョン|
|:----|:---|
|HostOS| Windows7 Home Premium Service Pack1
|VirtualBox| 4.3.26
|GuestOS| Ubuntu 14.04
|Vagrant| 1.8.1
|ubuntu| 14.04
|docker| 1.10.3
|fluentd| 0.12.19|
|Elasticsearch| 2.2.2|
|kibana| 4.4.2

# 実際に構築した環境
fluentdのTCP/8888にログを投げて、kibanaのTCP/5601でブラウジングできる。
![fluentd.jpg](https://qiita-image-store.s3.amazonaws.com/0/126580/3af46069-e45e-3289-9347-93c2ac7efc8b.jpeg)

# 成果物
GitHubからDownloadできる。
[https://github.com/hiroomit/vagrant](https://github.com/hiroomit/vagrant)

# 使い方
1.Git Bashでconsole立ち上げて作業フォルダを作成する。

```bash
$ mkdir -p vagrant/work
$ cd vagrant/work
```

2.GitHubからDownloadする。

```bash
$ git clone https://github.com/hiroomit/vagrant
```
3.仮想環境を立ち上げる。
Virtualboxをproviderにしてvagrantの立ち上げる。

```bash
$ cd vagrant/work
$ ./taniguchi_trusty64.sh start
```
4.fluentdログを飛ばす。

```bash
$ curl -v -H "Content-Type: application/json" -XPOST http://localhost:8888/test -d @sample.txt
```
5.kibanaにアクセスする。
[http://localhost:5601](http://localhost:5601)にアクセスする。
logstash-*でDashboardを作成する。

# 作り方
## Vagrantの準備
### VagrantのPluginのInstall
Git Bash立ち上げて作業フォルダを作成

```bash
$ mkdir -p vagrant/work
$ cd vagrant/work
```

とりあえず下記いれてみた。まずはsaharaだけでもいれておく。

```bash
$ vagrant plugin install sahara
```
あとは今後のお遊びのためのおまけ。

```bash
$ vagrant plugin list
docker-provider (0.1.0)
sahara (0.0.17)
vagrant-aws (0.7.0)
vagrant-berkshelf (4.1.0)
vagrant-lxc (1.2.1)
vagrant-omnibus (1.4.1)
vagrant-share (1.1.5, system)
```

### Vagrantfileの編集

```bash
$ vagrant init ubuntu/trusty64 
```
Vagrantファイルが生成されてるので設定を変更。
- config.vm.network: ipaddressをprivate networkの192.168.33.10の固定に設定。
- vb.gui: 最初はdebug用にvb.guiをtrueにして、動き始めたら#でコメントアウト。
- vb.memory: fluentd+Elasticsearch+kibanaの環境だとdefaultの1024MBでは足りず2048MBに増やした。
  
```bash
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
   config.vm.provider "virtualbox" do |vb|
     # Display the VirtualBox GUI when booting the machine
     vb.gui = true
  
     # Customize the amount of memory on the VM:
     vb.memory = "2048"
   end
  #
  # View the documentation for the provider you are using for more
  # information on available options.
```
### Vagrantの起動

```bash
$ vagrant up --provider virtualbox
```
ここで起動せずにはまった。
デバイスマネージャーからVirtualBox Host-Only Ethernet Adapterを作成することで回避した記憶。
> 関連リンク
> [http://www.makisima.org/v3/2010/11/12/virtualbox-err-host-only-network/](http://www.makisima.org/v3/2010/11/12/virtualbox-err-host-only-network/)
> Windows10系は別の話もあるっぽい。
> [http://d.hatena.ne.jp/kobarn/20150805](http://d.hatena.ne.jp/kobarn/20150805)
[https://www.virtualbox.org/ticket/14040](https://www.virtualbox.org/ticket/14040)

### Vagrantでboxのカスタマイズ
#### docker packageのinstall
ここは本当はchefとか使いたいところだが勉強が必要なのでここではinstall shell scriptで対応。ついでテスト用にcurlのinstall, sshキーの設定、fluentdのログをdockerのホストとコンテナで共有できるようDirectoryを作成。
> [Installation on ubuntu](https://docs.docker.com/engine/installation/linux/ubuntulinux/)

```bash
$ cat provision.sh
#!/bin/sh
sudo apt-get update

# install docker
sudo apt-get install -y apt-transport-https ca-certificates
while :
do
    sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
    if [ $? = 0 ]; then
        break;
    fi
done

sudo echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get purge lxc-docker
sudo apt-cache policy docker-engine
sudo apt-get install -y linux-image-extra-$(uname -r)
sudo apt-get install -y apparmor
sudo apt-get install -y docker-engine
sudo service docker start
sudo usermod -aG docker vagrant

# install curl
sudo apt-get install -y curl

# install ssh-key
sudo -u vagrant ssh-keygen -t rsa -N '' -f /home/vagrant/.ssh/id_rsa
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa

# prepare log for fluentd
mkdir -p /data
chmod 777 /data
```
#### Vagrantfileにprovision設定を追加
やっていることは下記のこと。
- chefのinstall
- provision.shの実行でdocker等のinstall
- dockerのコンテナ起動

```bash
  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   sudo apt-get update
  #   sudo apt-get install -y apache2
  # SHELL
  config.omnibus.chef_version=:latest
  config.vm.provision :shell, :path =>"provision.sh"
  config.vm.provision "docker" do |d|
    d.run "elasticsearch",
      args: "-p 9200:9200"
    d.run "kibana",
      args: "-p 5601:5601 --link elasticsearch:elasticsearch"
    d.run "hiroomi/fluentd",
      args: "-p 24224:24224 -p 8888:8888 -v /data:/fluentd/log -v /vagrant/data/fluentd/etc:/fluentd/etc"
  end
```
> Vagrantfile等は下記の日本語サイトでお勉強した。
> [Vagrant日本語ドキュメント](http://raqda.com/vagrant/index.html)

## Dockerイメージの準備
[Docker Hub](https://hub.docker.com/)を利用する。
fluentdはElasticsearchのplugin入れるのでdockerイメージをcustomizeして作成。
Elasticsearch、kibanaは本家のイメージを流用した。

### [hiroomi/fluentd](https://hub.docker.com/r/hiroomi/fluentd/)
official版[fluent/fluentd](https://hub.docker.com/r/fluent/fluentd/)にelasticsearchのpluginをinstallしようとしたがgem installできず大はまりしてしまった。
GitHubとの連携でAutomated BuildのRepositoryをDocker Hub上に作成した。

[ソース](https://github.com/fluent/fluentd-docker-image)からDockerfileを借用し
pluginをinstallしたうえでコンテナをBuildした。
[https://github.com/hiroomit/fluentd](https://github.com/hiroomit/fluentd)
の[Dockerfile](https://github.com/hiroomit/fluentd/blob/master/Dockerfile)に下記コマンドを追加。

```bash
# RUN gem install fluent-plugin-webhdfs
RUN gem install fluent-plugin-secure-forward --no-ri --no-rdoc
RUN gem install fluent-plugin-elasticsearch --no-ri --no-rdoc
```

fluent.confの設定
httpからの入力をelasticsearchがいる192.168.33.10/9200に飛ばす設定。
> [http Input Plugin](http://docs.fluentd.org/articles/in_http)
> [fluent-plugin-secure-forward](https://github.com/tagomoris/fluent-plugin-secure-forward/blob/master/README.md)
> [fluent-plugin-elasticsearch](https://github.com/uken/fluent-plugin-elasticsearch/blob/master/README.md)

```bash
$ cat data/fluentd/etc/fluentd.conf
<source>
  @type http
  @id   input1
  @label @mainstream
  port  8888
  bind 0.0.0.0
  body_size_limit 32m
  keepalive_timeout 10s
</source>

<filter **>
  @type stdout
</filter>

<label @mainstream>
  <match docker.**>
    @type file
    @id   output_docker1
    path         /fluentd/log/docker.*.log
    symlink_path /fluentd/log/docker.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   1m
    time_format       %Y%m%dT%H%M%S%z
  </match>
  <match **>
    @type elasticsearch
    host 192.168.33.10
    port 9200
    index_name fluentd
    type_name fluentd
    logstash_format true
    flush_interval 10s
  </match>
</label>
```

### [elasticsearch](https://hub.docker.com/_/elasticsearch/)
そのまま利用。
### [kibana](https://hub.docker.com/_/kibana/)
そのまま利用。elasticsearchとlinkして起動させる。

## Vagrantでprovisioningを行う。
失敗してもいいようにsaharaでsnapshotを作成しておく。

```bash
$ vagrant sandbox status
$ vagrant sandobox on # offで無効化、commitでsnapshot更新、rollbackで巻き戻し
$ vagrant provision
```
これで一通り立ち上げできた。

# このあとやりたいこと
- 実際にJenkinsからjsonのデータ飛ばしてログの収集、分析する。
- 今回のテスト環境を[Azure](https://azure.microsoft.com/ja-jp/)または[AWS](https://aws.amazon.com/jp/)で本番稼働させる。
- provisionにshellでなくて[chef](https://www.chef.io/chef/)や[Ansible](https://www.ansible.com/)を使ってみる。

# 参考
- [サーバ／インフラエンジニア養成読本 ログ収集〜可視化編](http://gihyo.jp/book/2014/978-4-7741-6983-5)
- [ELK(ElasticSearch, Logstash, Kibana)+fluentdの環境をDocker Composeで構築しつつ、試しにCloudWatchの統計データを収集してみた](http://qiita.com/khiraiwa/items/dc7e1c446d7e0c7d9482)
- [Vagrantのオススメ便利プラグイン](http://qiita.com/bigwheel/items/6b15e71be84e3a731818)

# リンク
- [git for winsows](https://git-for-windows.github.io/)
- [cURL](http://curl.haxx.se/)
- [VirtualBox](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp#vbox)
- [GitHub](https://github.com)
- [VAGRANT](https://www.vagrantup.com/)
- [docker](https://www.docker.com/)
- [Docker Hub](https://hub.docker.com/)
- [fluentd](http://www.fluentd.org/)
- [Elasticsearch](https://www.elastic.co/products/elasticsearch/)
- [kibana](https://www.elastic.co/jp/products/kibana/)