こんにちはこんにちは。FOLIO アドベントカレンダー 19日目の記事になります。昨日は @matsu_chara さんの ScaleCheck: A Single-Machine Approach for Discovering Scalability Bugs in Large Distributed Systemsを読んだ - だいたいよくわからないブログでした。
今回は AWS Fargate で出力したログが FireLens でだいぶ楽に管理できるようになったので、そのあたりの話をします。
これまでの Fargate のログ出力
Fargate ではログドライバーとして CloudWatch Logs しかサポートされていませんでした。そのため、Fargate タスクから出たログに対してフィルタリングなどの処理を行いたい場合、CloudWatch Logs の サブスクリプションフィルタを用いて AWS Lambda を追加で使用する必要がありました。
また、CloudWatch Logs のサブスクリプションフィルタは、ロググループに対して一つしか設定できません。そのため、複数の処理を行いたい場合は、Kinesis stream や AWS Lambda をハブとして使う必要がありました。
もしくは、ログを出力するアプリケーションとサイドカーで用意した Fluentd とで volume の共有を行い操作を行うこともできましたが、標準出力で出力していたログをファイルに出力するなどの変更が必要でした。こちらもあまりシンプルな構成とは言えません。
FireLens とは
Firelens は Amazon ECS タスクで使用できるログルーティング機能です。ECS on EC2 でも ECS on Fargate でもどちらでも使用でき、Fluentd や 軽量版の Fluent Bit と組み合わせることで、より柔軟なログルーティング設定を行うことができるようになります。Fluent Bit は Fluentd と比較し、使用できるプラグインに制限があったりしますが、ログの sender として使うだけであれば、基本的にはフットプリントの軽い Fluent Bit を使用したほうが良い場合が多いように思います。
FOLIO では
- アーカイブのためのログ保管
- エラーのフィルタリングや通知
部分で既に Fluentd を使用していたため、既存の仕組みをそのまま使用できるようになりました。
また、fluent-bit では標準で datadog logs へ送信できるプラグインもついており、これも非常に便利なポイントです。
実際の設定例
FireLens の設定例については、example のリポジトリにていろいろな例がまとまっています。 github.com
実際に使用する場合は
- ログを取得したいコンテナの
logConfiguration
をawsfirelens
に変更する - サイドカーとして Fluentd か Fluent Bit のコンテナを追加し、
firelensConfiguration
の設定を行う
ことで使用可能です。ECSタスク定義を以下のように設定します。
{ ... "containerDefinitions": [ { "name": "<ログを出力するコンテナ>", "logConfiguration": { "logDriver": "awsfirelens" }, ... }, { "name": "fluentbit", "firelensConfiguration": { "type": "fluentbit" }, ... } ] }
firelensConfiguration について
firelensConfiguration
では、 type
として fluentd
, fluentbit
のどちらかを指定し、 options
にて、追加設定ファイルの パスを指定できます。
追加設定ファイルのパスについては、
- S3 上のパス
- コンテナ上にあるファイルパス
のどちらかを選択可能となっています。
AWS がオフィシャルで公開しているのは https://github.com/aws/aws-for-fluent-bit のリポジトリで公開されているものをベースにした Docker イメージで、もともとの Fluent Bit のイメージをベースに github.com
の AWS 向けのプラグインが追加されたものになっています。が、 FireLens ではカスタムイメージの使用も可能なので、好きなプラグインを追加してカスタムイメージを作成し、それを使用することもできます。
logConfiguration について
ログを出力している側の logConfiguration
の options
に設定を追加することで、動的に [OUTOPUT]
レコードを追加してくれるようです。
例えば Fluent Bit の Datadog output プラグインをアウトプットとして使用する場合は
[OUTPUT] Name datadog Match * Host http-intake.logs.datadoghq.com TLS on dd_service my-service
のような設定が必要ですが、
"logConfiguration": { "logDriver":"awsfirelens", "options": { "Name": "datadog", "Host": "http-intake.logs.datadoghq.com", "TLS": "on", "dd_service": "my-service", }, } }
のように logConfiguration
を設定することで同じ設定が動的に生成されるようです。
FOLIO の場合は、Fluent Bit 経由で Datadog logs と Fluentd aggregator の両方に送る必要がありました。
2つの異なる output 設定を同時に設定することは難しそうであったため、どちらの [OUTPUT]
も設定した config を用意し、カスタムイメージに入れるように設定しました。
extra.conf
[OUTPUT] Name forward Match * Host <転送先ホスト名> Port 24224 Require_ack_response True Retry_Limit False [OUTPUT] Name datadog Match * Host http-intake.logs.datadoghq.com TLS on apikey <datadog api key> dd_service <サービス名> dd_source fluentbit dd_tags <datadog tags> Retry_Limit False
Dockerfile
FROM amazon/aws-for-fluent-bit COPY extra.conf /fluent-bit/etc/extra.conf
のような2つのファイルを用意し、
"firelensConfiguration": { "type": "fluentbit", "options": { "config-file-type": "file", "config-file-value": "/fluent-bit/etc/extra.conf" } },
のように設定を行うことで、
- Fluentd の aggregator
- Datadog Logs
の両方に送信を行うことができるようになっています。
まとめ
今までは、Fargate でできない制限がいくつかあったため、運用を考えたときに少し困ることがありましたが、Fargate も機能拡充を繰り返してきて、制限もだいぶなくなってきたように思います。 Fargate Spot や、 Saving plan などもあり、Fargate で困ることもだいぶ減ってきた気がするので、今後も Fargate 利用も検討していきたいと思います。