FireLens(Fluent Bit)の設定ファイルをローカル実行時とFireLensで起動したときの違いを見比べてみる
以下の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
なので、このファイルの内容を確認していきます。
- ローカル端末でaws-for-fluent-bitイメージを実行
- Fargateでaws-for-fluent-bitをFireLensで実行し、ユーザ独自の設定ファイルを含めない
- Fargateでaws-for-fluent-bitをFireLensで実行し、ユーザ独自の設定ファイルを含める
1. ローカル端末で実行
Dockerfileにはユーザ独自の設定ファイルをコピーしています。ユーザ独自の設定ファイルは/fluent-bit/etc/
パス配下にextra.confの名前で保存します。fluent-bit.confと同じ階層です。
FROM amazon/aws-for-fluent-bit:2.18.0 COPY ./extra.conf /fluent-bit/etc/extra.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)に入りました。
同じ設定ファイルを確認するとローカル実行時の面影がありません。FireLensでaws-for-fluent-bitのイメージを実行すると/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.conf
はFireLensで利用するため予約されています。ドキュメントには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で指定したパスが入っています。この設定が入ることにより、ユーザ独自の設定ファイルを呼び出されカスタムログルーティングが可能になるわけですね。
[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ブログと関連したものだと思われるリポジトリ
- amazon-ecs-firelens-under-the-hood/generated-configs/fluent-bit at mainline · aws-samples/amazon-ecs-firelens-under-the-hood
- 特にfluent-bitの設定ファイルの説明がオススメです
設定ファイルのサンプル集
効率よくFireLensを学んでいただけましたら幸いです。