Open4

FireLens って結局なんだっけ?どう使えばいいの?

mpywmpyw

Fluentd とは

https://www.fluentd.org/

ログをいい感じに集約するサービス。 Ruby 入れてる環境に立てられる。結構前からある。非常に多機能。でも Ruby いちいち入れないといけないのかよーっていうアレはあった。

Fluent Bit とは

組込み向け Fluentd という立ち位置だったけど, C/C++ からコンパイルされるシングルバイナリゆえにコンテナとの相性がいい。シンプルな処理で完結できる場合は基本 Fluentd より Fluent Bit 使うという認識で良さそう。

https://fluentbit.io/

mpywmpyw

で,FireLens って?

https://aws.amazon.com/jp/blogs/news/under-the-hood-firelens-for-amazon-ecs-tasks/

https://qiita.com/charon/items/65ac91caa9dc5aec8635

すごくふわふわした概念だけど,自分が一番落ち着いたのはこの表現。

FireLens は Docker のログドライバーですか?

"logConfiguration": {
    "logDriver": "awsfirelens",
    "options": {
        "Name": "firehose",
        "region": "us-west-2",
        "delivery_stream": "my-stream"
    }
}

いいえ。awsfirelens ログドライバーは、タスク定義用のシンタックスシュガーであり、Fluentd または FluentBit のアウトプットプラグインの設定を指定できます

JSON 定義の中に awsfirelens が出てくるし,繋ぎ先はあくまで Fluent Bit であるように見えるのでミスリードされがちだけど,

  • FireLens コンテナは Fluent Bit または Fluentd を実装の中身として選択でき,それらのスーパーセット的な立ち位置になってる(フルマネージドではないけど MySQL, Postgres に対する Aurora みたいな立ち位置と近い)
  • awsfirelens 自体はただのログドライバーだが,送信元サービスのログドライバーから送信先 Fluent Bit に到達するまでの一連の流れを FireLens と総称で呼んでいるような気がする

で合ってそう。

mpywmpyw

awsfirelens ドライバの機能

  • ECS タスクから吐かれる標準出力/エラー出力の送信先は,
    • デフォルトの awslogs ドライバの場合は CloudWatch Logs に流れる
    • awsfirelens ドライバに変更するとサイドカーコンテナの FireLens(中身はほぼ Fluent Bit) に流れる
  • 送信元コンテナにあてられた awsfirelens ドライバオプションのオプションが,FireLens コンテナの OUTPUT に変換されて書き込まれる。
    • 要するに,送ってくる側の都合で送られる側の Fluent Bit コンテナの設定ファイル書き換えなくていいよ。送る側に併せて宣言させるから。 みたいな感じ

インフラの変更頻度が低く済むので使い勝手は良さそう。

AWS より

Qiita 記事より

mpywmpyw

ログ転送先振り分けの戦略

よくあるやつ↓

  • Info は S3 に送りたい
  • Emergency 〜 Warning は NewRelic + S3 に送りたい

コンテナ出力の stdout を正規表現で振り分ける方式

https://qiita.com/SoarTec-lab/items/26ffafc4f2144f49d21b

この方は OUTPUT を手書きしている。 OUTPUTMatch もタスク設定の JSON から注入すればええやん?って一見思うが…

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/firelens-taskdef.html

これを見ると

となっており,イメージビルドして設定を手書きするしか方法がないことが分かる。