Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

前回の続きです。
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ですが下記の感じにしてみました

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の定義から抜粋すると

指定方法 説明
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のモニタリングをみると

スクリーンショット 2020-02-18 13.10.56.png

s3をみると

スクリーンショット 2020-02-18 13.10.25.png

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

arata-honda
株式会社レコチョクでマイクロサービスまわりの開発を行っています。 バックグラウンドは大学、大学院で機械学習、信号処理系の理論をやってました。 記事を上げるとすれば自分のバックグラウンドに絡めたものか、 業務で培った知識を備忘録として残すために書きます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away