FluentdとDockerとKinesis Firehose その2(fluent.conf作成編)

# はじめに
[前回](https://qiita.com/arata-honda/items/03d6da7c9f84f67466a9)の続きです。
fluent.confを書いてローカルからkinesis data firehoseに流し込むところまでです

# 前回からのDockerfileの修正点
[公式](https://hub.docker.com/r/fluent/fluentd/)をみていたら

"3. Customize Dockerfile to install plugins (optional)"の節を見落としていました。
fluent.confの場所をCOPYする場所が最後の方だったので、修正しました。

修正後はこんな感じになっています。(ほとんど公式通り)

```dockerfile
FROM fluent/fluentd:v1.9-1

USER root

# install plugin
RUN apk add --update-cache --virtual .build-deps sudo build-base ruby-dev \
    && gem install fluent-plugin-kinesis -v 3.0.0 --no-document \
    && gem sources --clear-all \
    && apk del .build-deps \
    && rm -rf /var/cache/apk/* \
    /home/fluent/.gem/ruby/*/cache/*.gem

# set timezone (Alpine)
RUN apk --update-cache add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata && \
    rm -rf /var/cache/apk/*

COPY ./kinesis.conf /fluentd/etc/fluent.conf

USER fluent
```

つづいて、fluent.confですが下記の感じにしてみました

```kinesis.conf
<source>
  @type  forward
  @id    input1
  @label @mainstream
  port   24224
</source>

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

<label @mainstream>
  <match kinesis.**>
    @type kinesis_firehose
    @id  output_docker1
    region ap-northeast-1
    aws_key_id your_aws_access_key_id
    aws_sec_key your_aws_secret_key
    delivery_stream_name test-kinesis-firehose-fluentd
    <buffer tag,time>
      @type file
      path /fluentd/log/kinesis
      timekey 30
      timekey_wait 30
      timekey_use_utc true
    </buffer>
    <format>
      @type json
    </format>
  </match>
  <match **>
    @type file
    @id   output1
    path         /fluentd/log/data.*.log
    symlink_path /fluentd/log/data.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   10m
    time_format       %Y%m%dT%H%M%S%z
    <format>
      @type json
    </format>
  </match>
</label>
```

[fluent.confの定義](https://docs.fluentd.org/configuration/config-file)から抜粋すると

|  指定方法  |  説明  |
| ---- | ---- |
|  source  |  インプットを定義する所   |
|  match  |  アウトプットを定義する所  |
|  label  |  内部ルーティング用のアウトプットとフィルターのグループに関する定義  |
|  @include  |  他のファイルを含める命令  |
|  filter  |  イベント処理のパイプラインを決定する命令 |

となっているので、読み方としては

*入力*

- [foward](https://docs.fluentd.org/input/forward): tcp経由で来たイベントを取得する(内部でfluent-catを使用するfluent-loggerというライブラリなどで送信)
- label: @mainstreamというlabelで定義されたoutputに紐づくことをさす
- port: 24224で受け付けます
- ip: 指定していないとデフォルト "0.0.0.0"

*フィルター*

- stdout: 標準出力

`2020-02-14T10:48:53+09:00    docker.test    {"key":"value"}`

こんな感じで処理される

*出力*

- match kinesis.**: "kiensis.hoge"というイベントで出力しますよという定義
- aws_key_id, aws_sec_key: kinesisにアクセスできる権限を持ったcredentialを定義(ECS等の場合はRole)
- type: kinesis_firehose
- delivery_stream_name: kinesis data firehoseのdelivery_stream_name
- buffer: 出力ファイルを分割する定義. * path*を定義しないとkinesis_firehoseに飛ばしてくれない
- timekey: 30秒たったらbufferとしてpath以下に吐き出す設定

<match **>は公式のまんまです。debug用としてデータが吐き出されるかみてるだけです。

ハマったのはbufferは設定したもののpathを設定してなかったので、ファイルが吐き出されずに、吸い取られる(flush)されることなく永遠にkinesis data firehoseに送り込まなかったことでした。

あと、confがイケてるかチェックするには
`fluentd --dry-run -c confの場所`
でできます。

```bash
/fluentd/log/kinesis $ echo '{"I say":"hello"}' | fluent-cat kinesis.test
/fluentd/log/kinesis $ echo '{"I say":"hello"}' | fluent-cat kinesis.test
/fluentd/log/kinesis $ echo '{"I say":"hello"}' | fluent-cat kinesis.test
/fluentd/log/kinesis $ echo '{"I say":"hello"}' | fluent-cat kinesis.test
/fluentd/log/kinesis $ pwd
/fluentd/log/kinesis
/fluentd/log/kinesis $ ls -la
total 16
drwxr-xr-x    6 fluent   nogroup        192 Feb 18 11:56 .
drwxr-xr-x   14 fluent   nogroup        448 Feb 18 11:51 ..
-rw-r--r--    1 fluent   nogroup         21 Feb 18 11:56 buffer.b59ed0d18a89e7ab3ccaa887b7ccfb789.log
-rw-r--r--    1 fluent   nogroup         86 Feb 18 11:56 buffer.b59ed0d18a89e7ab3ccaa887b7ccfb789.log.meta
-rw-r--r--    1 fluent   nogroup        126 Feb 18 11:56 buffer.b59ed0d197a62770a411b37f39a5d3f3a.log
-rw-r--r--    1 fluent   nogroup         86 Feb 18 11:56 buffer.b59ed0d197a62770a411b37f39a5d3f3a.log.meta
/fluentd/log/kinesis $ cat buffer.b59ed0d197a62770a411b37f39a5d3f3a.log
��{"I say":"hello"}
��{"I say":"hello"}
��{"I say":"hello"}
��{"I say":"hello"}
��{"I say":"hello"}
��{"I say":"hello"}
```
こんな感じでbufferが吐き出されて、30秒ほどまつと吸い取られます。

kinesisのモニタリングをみると

<img width="1197" alt="スクリーンショット 2020-02-18 13.10.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211139/e292ca72-b03e-8209-8bcb-6007a14bbdb6.png">


s3をみると

<img width="861" alt="スクリーンショット 2020-02-18 13.10.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211139/3d0e73a8-c2fe-dbb7-9fb4-96dba69e59de.png">

できてました。
次回はECSにのっけます。