FireLens(Fluent Bit)の設定ファイルをローカル実行時とFireLensで起動したときの違いを見比べてみる

FireLensで起動するときのFluent Bit(aws-for-fluent-bit)の設定ファイルの内容を見てみよう。
2021.08.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以下のAWSブログで説明されている文章が何を示しているのか、AWS FargateとFireLens(Fluent Bit)を使って調べました。調べてわかったことはFluent Bitの設定ファイルとECSのタスク定義の関連性を把握しておくとトラブルシュート時に役にたちそうです。

オプションのユーザー提供の設定。ユーザーが独自の設定ファイルを指定した場合、include ディレクティブを使用して、生成された設定ファイルにインポートします。

引用: 詳解 FireLens – Amazon ECS タスクで高度なログルーティングを実現する機能を深く知る | Amazon Web Services ブログ

まとめ

  • ユーザ独自の設定ファイルは /fluent-bit/etc/fluent-bit.confから呼び出される
  • /fluent-bit/etc/fluent-bit.confの設定内容はFireLensとして起動した時に設定内容が書き換わる
  • タスク定義内で指定した値が/fluent-bit/etc/fluent-bit.confに追記されるイメージ

検証環境

AWS Fargateを利用してFireLensを起動し検証します。FireLensのイメージはFluent Bitを利用します。

FireLensで使用するFluent BitのイメージとしてAWSから提供されているaws-for-fluent-bitがあります。

項目 バージョン
aws-for-fluent-bit 2.18.0
Fluent Bit 1.8.2
Fargate Platform 1.4.0

地道に設定ファイルを確認していく

Fluent Bitの設定ファイルの内容を各実行環境毎に確認します。Fluent Bitの設定ファイルは/fluent-bit/etc/fluent-bit.confなので、このファイルの内容を確認していきます。

  1. ローカル端末でaws-for-fluent-bitイメージを実行
  2. Fargateでaws-for-fluent-bitをFireLensで実行し、ユーザ独自の設定ファイルを含めない
  3. Fargateでaws-for-fluent-bitをFireLensで実行し、ユーザ独自の設定ファイルを含める

1. ローカル端末で実行

Dockerfileにはユーザ独自の設定ファイルをコピーしています。ユーザ独自の設定ファイルは/fluent-bit/etc/パス配下にextra.confの名前で保存します。fluent-bit.confと同じ階層です。

Dockerfile

FROM amazon/aws-for-fluent-bit:2.18.0
COPY ./extra.conf /fluent-bit/etc/extra.conf

/fluent-bit/etc/fluent-bit.confの設定ファイルの内容を確認した結果は以下になります。「そういうもんなんだ」くらいの感想です。リージョン設定を見ると何かしら修正しないと期待通りの動きしない感じがします。いつ編集するのでしょうか?自前の設定ファイルはイメージ内にコピーしただけです。

/fluent-bit/etc/fluent-bit.conf

[INPUT]
    Name        forward
    Listen      0.0.0.0
    Port        24224
[OUTPUT]
    Name cloudwatch
    Match   **
    region us-east-1
    log_group_name fluent-bit-cloudwatch
    log_stream_prefix from-fluent-bit-
    auto_create_group true

2. ユーザ独自の設定ファイルなしでFireLensで起動

Fargateのタスク定義のfirelensConfiguretionの内容は以下の通りです。

タスク定義抜粋

      "firelensConfiguration": {
        "type": "fluentbit",
        "options": null
      },

FargateでFireLensとしてaws-for-fluent-bitコンテナが起動させ、ECS ExecでFireLensコンテナ(log_router)に入りました。 同じ設定ファイルを確認するとローカル実行時の面影がありません。FireLensaws-for-fluent-bitのイメージを実行すると/fluent-bit/etc/fluent-bit.confの内容が書き換わることを確認できました。

/fluent-bit/etc/fluent-bit.conf

[INPUT]
    Name tcp
    Listen 127.0.0.1
    Port 8877
    Tag firelens-healthcheck

[INPUT]
    Name forward
    unix_path /var/run/fluent.sock

[INPUT]
    Name forward
    Listen 127.0.0.1
    Port 24224

[FILTER]
    Name record_modifier
    Match *
    Record ecs_cluster sample-test-cluster
    Record ecs_task_arn arn:aws:ecs:ap-northeast-1:123456789012:task/sample-test-cluster/d4efc1a0fdf7441e821a3683836ad69a
    Record ecs_task_definition sample-test-webapp-taskdefinition:15

[OUTPUT]
    Name null
    Match firelens-healthcheck

Fluent Bitの場合/fluent-bit/etc/fluent-bit.confFireLensで利用するため予約されています。ドキュメントにはImportantと表記されるわけですね、仮にこの設定ファイルに追記して設定変更しても起動時に書き換わってしまうから。

Creating a task definition that uses a FireLens configuration - Amazon ECS

補足

確認にあたり実行したことは下記リンクの件とほぼ同じ内容です。こちらはアプリコンテナのログをFireLensの標準出力に送る設定をタスク定義に追加しています。それにより/fluent-bit/etc/fluent-bit.confの最後に[OUTPUT]の項目が追加されました。リンク先を見ていただかないとよくわからないと思いますが、どちらも検証した身としてはタスク定義の指定内容とfluent-bit.confの関連性がわかり理解が深まりました。

リンク先の設定ファイル内容抜粋

[OUTPUT]
    Name stdout
    Match webapp-firelens*

ここで言うタスク定義に設定した標準出力に送るというのが[OUTPUT]項目に追加されたというのは、以下の文章のことを指していました。

タスク定義から生成されたログ保管先。awsfirelens という疑似ドライバーで指定した設定オプションは、Fluentd または Fluent Bit のアウトプットプラグインの設定に変換されます。

引用: 詳解 FireLens – Amazon ECS タスクで高度なログルーティングを実現する機能を深く知る | Amazon Web Services ブログ

3. ユーザ独自の設定ファイルありでFireLensで起動

タスク定義のfirelensConfiguretionは以下の内容です。Dockerfile内にコピーしたユーザ独自の設定ファイルのパスをconfig-file-valueで指定しています。FargateでFireLensを使いカスタムログルーティングするときによく使うパターンです。

タスク定義抜粋

      "firelensConfiguration": {
        "type": "fluentbit",
        "options": {
          "config-file-type": "file",
          "config-file-value": "/fluent-bit/etc/extra.conf"
        }

同様にFargateでFireLensとして起動させ、ECS Execから確認します。@INCLUDE /fluent-bit/etc/extra.confの行が追加されていました。ユーザ独自の設定ファイルを呼び出す設定です。タスク定義のconfig-file-valueで指定したパスが入っています。この設定が入ることにより、ユーザ独自の設定ファイルを呼び出されカスタムログルーティングが可能になるわけですね。

/fluent-bit/etc/fluent-bit.conf

[INPUT]
    Name tcp
    Listen 127.0.0.1
    Port 8877
    Tag firelens-healthcheck
[INPUT]
    Name forward
    unix_path /var/run/fluent.sock
[INPUT]
    Name forward
    Listen 127.0.0.1
    Port 24224
[FILTER]
    Name record_modifier
    Match *
    Record ecs_cluster sample-test-cluster
    Record ecs_task_arn arn:aws:ecs:ap-northeast-1:123456789012:task/sample-test-cluster/13c0122f7f384cb7a67088d183dd46d9
    Record ecs_task_definition sample-test-webapp-taskdefinition:9
@INCLUDE /fluent-bit/etc/extra.conf
[OUTPUT]
    Name null
    Match firelens-healthcheck

確認できたこと

FireLensとしてaws-for-fluent-bitを起動すると、/fluent-bit/etc/fluent-bit.confの内容が書き換わりました。/fluent-bit/etc/fluent-bit.confがシステム側で予約されている理由のひとつでしょう。

また、タスク定義で指定した値が/fluent-bit/etc/fluent-bit.confに追加されます。指定した項目によってはイメージ内にコピーしたユーザ独自の設定ファイルを参照してくれるようになり、カスタムログルーティングを実現しています。

カスタムログルーティングはFluent Bitの設定次第でエラーログはCloudWatch Logsへ保存、それ以外はKinesis Firehose経由でS3へ保存するといった保存先の振り分けや、不要なログのフィルタリングなど柔軟なログ設定ができます。

おわりに

aws-for-fluent-bitとFireLensについてここ数日調べていました。いろいろ回り道をしながらなのですが、今になって思うと設定ファイルは先に抑えておくべきでした。後の学習効率に違いがでたのではないかと。そんな回り道をしたなかでは、今のところ以下のリンクがFireLensの理解に有用でしたので共有します。

基本的な部分を理解してから読むとよくわかる

上のAWSブログと関連したものだと思われるリポジトリ

設定ファイルのサンプル集

効率よくFireLensを学んでいただけましたら幸いです。

参考