dockerのfluentd logging driverで集約したログをs3に蓄積する

dockerの勉強のため、[実例で学ぶDockerハンズオン](http://qiita.com/kohey18/items/dffe9b11d330576ab852)の構成をベースに、aws上で動かしてみた。

![aws-docker-fluentd-s3.PNG](https://qiita-image-store.s3.amazonaws.com/0/124221/cf62d59e-68ec-3a24-e720-98eb5c3fb688.png)

# s3のbucketを用意

ログファイル書き込み先のaws s3 bucketを作成、access keyとsecret keyを取得。

参考：https://joppot.info/2014/06/14/1621


# Docker Hubにimageを登録

Dockerfileを作成してGitHubにpush。

https://github.com/khwada/aws-docker-fluentd-s3

Docker HubでAutomated Buildを作成してimageを登録。
GitHubの1リポジトリ上に3種のDockerfileを置いたため、Automated Buildは3つ作成した。

https://hub.docker.com/r/khwada/nginx/
https://hub.docker.com/r/khwada/sinatra/
https://hub.docker.com/r/khwada/fluentd-s3/

なお、s3のbucketなどの情報は、コンテナ起動時に環境変数で指定する。


# aws ec2上でdocker containerを起動

参考： http://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html#install_docker

ssh(22)とhttp(80)を開けてec2インスタンスを作成。
dockerをインストール。

Docker Hubからdocker imageをpull。

```console
docker pull khwada/fluentd-s3
docker pull khwada/sinatra
docker pull khwada/nginx
```

docker containerを起動。

nginxからsinatraへは、link。
nginxおよびsinatraからfluentdへは、log driverで連携。


```console
docker run --name fluentd-s3 -d -p 8888:8888  \
-e "AWS_ACCESS_KEY_ID={s3のaccess key}" \
-e "AWS_SECRET_ACCESS_KEY={s3のsecret key}" \
-e "FLUENTD_S3_BUCKET={s3のbucket名}" \
-e "FLUENTD_S3_REGION={s3のregion、例；aps-northeast-1}" \
khwada/fluentd-s3

docker run --name sinatra -d --log-driver=fluentd --log-opt=fluentd-address=localhost:8888 --log-opt fluentd-tag=docker.{{.Name}} khwada/sinatra

docker run --name nginx -d -p 80:80 --link sinatra:sinatra --log-driver=fluentd --log-opt fluentd-address=localhost:8888 --log-opt fluentd-tag=docker.{{.Name}} khwada/nginx
```


# 動作確認

ブラウザから、作成したec2インスタンスにアクセス（http）。
"Hello World!"と表示されれば、nginxとsinatraが正しくlinkできている。

またnginxとsinatraのログが、fluentdで集約され、s3に送られる（10秒ごとにflushするようにしている）。

fluentdコンテナのログでも確認可能（デバッグ用）。

```console
docker logs fluentd-s3
```


# 詰まったところ

ローカルマシーンのVM上でdockerを動かしていたとき、s3にログファイルを送れない事象が発生した。
⇒docker run -vでマウントしているディレクトリを、buffer先に指定していると発生する模様。

```console
docker run --name td-agent -d -v /vagrant/log/:/var/log/td-agent -p 8888:8888 khwada/td-agent
``````

```td-agent.conf
path /var/log/td-agent/s3
```

```
2016-05-05 09:05:36 +0000 [error]: error on output thread error="Text file busy @ sys_fail2 - (/var/log/td-agent/s3.20160505-0842.b5321452e6036d6fa.log, /var/log/td-agent/s3.20160505-0842.q5321452e6036d6fa.log)"
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/plugin/buf_file.rb:68:in `rename'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/plugin/buf_file.rb:68:in `mv'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/plugin/buf_file.rb:185:in `enqueue'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/buffer.rb:296:in `block (2 levels) in push'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/buffer.rb:295:in `block in push'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/buffer.rb:289:in `push'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:534:in `block (2 levels) in configure'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:533:in `each'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:533:in `block in configure'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:585:in `call'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:585:in `enqueue_buffer'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:297:in `block in try_flush'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:295:in `try_flush'
  2016-05-05 09:05:36 +0000 [error]: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.20/lib/fluent/output.rb:140:in `run'
```


下記に変更したら、正常に送られるようになった。

```td-agent.conf
buffer_path /var/tmp/s3
```