td-agent3（Fluentd v1.0）でS3にログを保存する。2018-03-01

# 内容
[Amazon S3 Output Plugin](https://docs.fluentd.org/v1.0/articles/out_s3) を参考に、`td-agent3`（`Fluentd v1.0`）で `S3` にログを保存する設定をします。

# 準備
* `td-agent3`（`Fluentd v1.0`）のインストールは済んでいるものとします
    * 参考: [Ubuntu 16.04.3 LTSにtd-agent3（Fluentd v1.0）をインストールする](https://qiita.com/abetomo/items/86d5c0ab152a593d9fc7)
* AWSのIAM、S3での準備作業が必要になりますが、割愛します
    * 設定で指定する `aws_key_id` のユーザがS3に書き込める必要があります。

# `fluent-plugin-s3` のインストール
**追記:**
**個別にインストールしなくても `td-agent` に含まれているようでした。**
**このインストールの手順を踏むことで最新のものが利用できる状態にはなります**

* `fluent-plugin-s3` というプラグインが必要なのでインストールします。
* インストールで使うコマンドは `/opt/td-agent/embedded/bin/fluent-gem` にあります

## インストール
```
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-s3
Fetching: fluent-plugin-s3-1.1.1.gem (100%)
Successfully installed fluent-plugin-s3-1.1.1
Parsing documentation for fluent-plugin-s3-1.1.1
Installing ri documentation for fluent-plugin-s3-1.1.1
Done installing documentation for fluent-plugin-s3 after 0 seconds
1 gem installed
```

## 確認
```
$ /opt/td-agent/embedded/bin/fluent-gem list fluent-plugin-s3

*** LOCAL GEMS ***

fluent-plugin-s3 (1.1.1, 1.1.0
```

# 設定の例
ApacheのアクセスログをS3に送る例です。

```conf:/etc/td-agent/td-agent.conf
# <source> についての詳細は割愛
<source>
  @type tail
  path /var/log/apache2/access.log
  tag apache.access
  pos_file /var/log/td-agent/apache-access-log.pos
  format apache2
</source>

# <match> の内容が本題
<match *.**>
  @type s3

  aws_key_id YOUR_AWS_KEY_ID
  aws_sec_key YOUR_AWS_SECRET_KEY
  s3_bucket YOUR_S3_BUCKET_NAME
  s3_region us-east-1
  path logs/${tag}/%Y-%m-%d/
  s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}

  # if you want to use ${tag} or %Y/%m/%d/ like syntax in path / s3_object_key_format,
  # need to specify tag for ${tag} and time for %Y/%m/%d in <buffer> argument.

  <buffer tag,time>
    @type file
    path /var/log/td-agent/s3
    timekey 3600
    timekey_wait 10m
    chunk_limit_size 256m
  </buffer>
</match>
```

# 動作確認
以上の設定例で `td-agent` を起動してログ（`/var/log/td-agent/td-agent.log`）を確認します。
特に問題がなさそうであれば

```
$ while true; do curl localhost > /dev/null && sleep 30; done
```

などでアクセスログを出力して、S3にログがたまっていくか確認します。

# S3の状況を確認
* （検証に使っていたサーバのTZはUTCです）
* （時間は5分くらい遅れてました :cry: ）

`YOUR_S3_BUCKET_NAME/logs/apache.access/2018-03-02` の下に以下のようにgzなログが送られてきたのを確認できました。

![スクリーンショット 2018-03-02 14.21.34.png](https://qiita-image-store.s3.amazonaws.com/0/3800/3ed0774b-5039-2afc-fab3-b4b9f1196cbf.png)


ログの内容は以下の通りです。

```
2018-03-02T03:00:12+00:00	apache.access	{"host":"127.0.0.1","user":null,"method":"GET","path":"/","code":200,"size":11576,"referer":null,"agent":"curl/7.47.0"}
2018-03-02T03:00:42+00:00	apache.access	{"host":"127.0.0.1","user":null,"method":"GET","path":"/","code":200,"size":11576,"referer":null,"agent":"curl/7.47.0"}
2018-03-02T03:01:12+00:00	apache.access	{"host":"127.0.0.1","user":null,"method":"GET","path":"/","code":200,"size":11576,"referer":null,"agent":"curl/7.47.0"}
...
```

# まとめ
`td-agent3`（`Fluentd v1.0`）で `S3` にログを保存できました。

# その他
## エラーが出た
```
[error]: #0 Permission denied @ rb_sysopen - /var/log/apache2/access.log
```

のようなエラーが出るときはchmodします。

```
$ sudo chmod -R 755 /var/log/apache2/
```

## EC2 IAMロール + td-agent
「EC2インスタンスで `td-agent` を動かしてS3にログを送る & そのインスタンにはS3に書き込める権限を持つIAMロール付き」

以上のような状況の場合はIAMロールがよしなにやってくれるので、以下の認証の設定が不要です。

```
  aws_key_id YOUR_AWS_KEY_ID
  aws_sec_key YOUR_AWS_SECRET_KEY
```

## 参考: Buffer section configurations
https://docs.fluentd.org/v1.0/articles/buffer-section

## `<buffer tag,time>` の設定を変える
以下の設定にするとS3にログを送る間隔が短くなります

```conf:<buffer>のところだけ抜粋
...
  <buffer tag,time>
    @type file
    path /var/log/td-agent/s3
    # timekey 3600
    # timekey_wait 10m
    timekey 60
    timekey_wait 60
    chunk_limit_size 256m
  </buffer
...
```

![スクリーンショット 2018-03-02 14.30.30.png](https://qiita-image-store.s3.amazonaws.com/0/3800/6c55df89-990d-b82e-cfd8-863b27f312f5.png)