はじめに
前回の続きです。
fluent.confを書いてローカルからkinesis data firehoseに流し込むところまでです
前回からのDockerfileの修正点
公式をみていたら
"3. Customize Dockerfile to install plugins (optional)"の節を見落としていました。
fluent.confの場所をCOPYする場所が最後の方だったので、修正しました。
修正後はこんな感じになっています。(ほとんど公式通り)
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ですが下記の感じにしてみました
<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の定義から抜粋すると
指定方法 | 説明 |
---|---|
source | インプットを定義する所 |
match | アウトプットを定義する所 |
label | 内部ルーティング用のアウトプットとフィルターのグループに関する定義 |
@include | 他のファイルを含める命令 |
filter | イベント処理のパイプラインを決定する命令 |
となっているので、読み方としては
入力
- foward: 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以下に吐き出す設定
は公式のまんまです。debug用としてデータが吐き出されるかみてるだけです。
ハマったのはbufferは設定したもののpathを設定してなかったので、ファイルが吐き出されずに、吸い取られる(flush)されることなく永遠にkinesis data firehoseに送り込まなかったことでした。
あと、confがイケてるかチェックするには
fluentd --dry-run -c confの場所
でできます。
/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のモニタリングをみると
s3をみると
できてました。
次回はECSにのっけます。