Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

Fluentd v0.14 では fluent-plugin-forest が不要な話

少し前のことですが、 Fluentd の v0.14 が stable になりましたね。 イコール v1.0 である通り、安定感が増した感じがしています。 ブログのネタが無いので今回は Fluentd の小ネタを投稿することにしますw 一応ここでは比較のために v0.12, v0.14 と表記します、というか v0.14 に慣れすぎてまだ v1.0 と呼ぶのに慣れてないだけなんですが。

v0.12 まで必須だったようなプラグインの機能でも、 v0.14 ではコアの機能でカバーできることが多くなりハッピーになりましたが、どのように設定を修正していいのかパッとわからない場合があります。 例として、 fluent-plugin-forest の話を紹介しましょう。

GitHub - tagomoris/fluent-plugin-forest

Fluentd 公式のプラグインリストのダウンロード数で 3 位を誇るこの forest plugin ですが、そもそも何に使ってるものかというと、
例えばあるプラグインプレースホルダが使えない時にこの forest plugin を使うとあたかもプレースホルダが使えるかのように動作してくれるという、かゆいところに手が届くありがたいものになります。

設定のサンプルはこちらです。 s3 plugin を使っています。 GitHub - fluent/fluent-plugin-s3: Amazon S3 input and output plugin for Fluentd

# v0.12
<match pattern.**>
  type forest
  subtype s3
  <template>
    <instance_profile_credentials>
    </instance_profile_credentials>

    s3_bucket YOUR_S3_BUCKET_NAME
    s3_region ap-northeast-1

    path logs/${tag_parts[1]}/%Y/%m/%d/${tag_parts[1]}.${tag_parts[2]}
    s3_object_key_format %{path}.%{time_slice}_%{index}.%{file_extension}

    buffer_path /var/tmp/s3
    time_slice_format %Y%m%d-%H
    time_slice_wait 10m
    utc
  </template>
</match>

s3 plugin を使ってデータを tag ごとに分けてアップロードしたい場合に、 s3 plugin だけではプレースホルダに対応していなくて実現できなかったのですが、
<template> の中に設定を書いて ${tag_parts[1]} のような記述を使うことにより解決できるといった流れです。

余談ですが、 AWS の EC2 上の Fluentd の docker コンテナから S3 にデータをアップロードしたい場合はサンプルのように <instance_profile_credentials> を設定してあげると、 EC2 にあたっている IAM instance profile を利用することができるので設定ファイルに AWS_ACCESS_KEY_ID や AWS_SECRET_ACCESS_KEY を書かなくて良くなり便利です。

で、 forest plugin は README にある通り v0.14 から不要になったはずなので設定を書き換えてみるわけですが、 s3 plugin の方がプレースホルダに対応してないとすればどう変更したらよいのでしょうか。

変更した後のサンプルはこちらです。

<match pattern.**>
  @type s3

  <instance_profile_credentials>
  </instance_profile_credentials>

  s3_bucket YOUR_S3_BUCKET_NAME
  s3_region ap-northeast-1

  path logs/${tag[1]}/%Y/%m/%d/${tag[1]}.${tag[2]}
  s3_object_key_format %{path}.%{time_slice}_%{index}.%{file_extension}
  time_slice_format %Y%m%d-%H

  <buffer tag,time>
    @type file
    path /var/tmp/s3
    timekey 3600
    timekey_wait 10m
    timekey_use_utc true
  </buffer>
</match>

単純ですが、 ${tag[1]} を使うことができるので、今回の例では forest plugin は不要になりましたね。

他にも、 reemit plugin なんかはコアの機能の label を使うことで reemit しなくてもうまく tag のルーティングすることができるので便利になっています。 GitHub - sonots/fluent-plugin-reemit: Fluentd plugin to re-emit messages avoiding infinity match loop to achieve branching of data flow

あと過去のエントリで書いたマルチコアの利用なんかもありがたいですよね。

innossh.hatenablog.com

まとまらないですが今回の小ネタは以上です。