FireLens で New Relic 謹製 Fluent Bit イメージを起動したときの設定ファイル、プラグインを ECS Exec で調べてみた

2022.01.01

FireLens で New Relic Logs へログを保存するにあたり New Relic 謹製 Fluent Bit イメージを利用しています。過去に FireLens で起動する Fluent Bit コンテナには設定が追加されることを確認しています。

New Relic 謹製 Fluent Bit イメージの場合はどうなのか?ECSのタスク定義の関連性を把握しておくとトラブルシュートに役立ちそうなの確認してみます。

確認結果

  • New Relic 謹製 Fluent Bit イメージのベースイメージは AWS for Fluent Bit である
  • ベースの AWS for Fluent Bit のバージョンは比較的古いバージョンが採用されている
  • New Relic用プラグインはおそらく最新のバージョンが同梱されている

検証環境

以下の検証環境を利用し Fluent Bit コンテナに ECS Exec でログインし設定ファイルを確認します。

ログルータで使用中の New Relic 謹製 Fluent Bit のイメージファイル名は以下です。

533243300146.dkr.ecr.ap-northeast-1.amazonaws.com/newrelic/logging-firelens-fluentbit

ECR Public Gallery で公開されているわけではなくプライベートレジストリにイメージが保存されています。イメージのタグ情報は見当たりませんでした。

ログインして調査してみた

Fluent Bit コンテナ(log_router)に ECS Exec でログインして必要な箇所を見て回ってきます。

イメージファイル

ベースイメージは AWS for Fluent Bit でした。しかも、何か意図がありそうな少し古いバージョン。

# ls -l
total 76
-rw-r--r--   1 root root    6 Aug  3 18:28 AWS_FOR_FLUENT_BIT_VERSION
lrwxrwxrwx   1 root root    7 Jul 26 23:51 bin -> usr/bin
dr-xr-xr-x   2 root root 4096 Apr  9  2019 boot
drwxr-xr-x   5 root root  340 Dec 31 01:59 dev
drwxr-xr-x   2 root root 4096 Aug  3 18:39 ecs
-rwxr-xr-x   1 root root  235 Aug  3 18:28 entrypoint.sh
drwxr-xr-x   1 root root 4096 Dec 31 01:59 etc
drwxr-xr-x   1 root root 4096 Aug  3 18:39 fluent-bit
drwxr-xr-x   2 root root 4096 Apr  9  2019 home
lrwxrwxrwx   1 root root    7 Jul 26 23:51 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Jul 26 23:51 lib64 -> usr/lib64
drwxr-xr-x   2 root root 4096 Jul 26 23:51 local
drwxr-xr-x   3 root root 4096 Dec 31 01:59 managed-agents
drwxr-xr-x   2 root root 4096 Apr  9  2019 media
drwxr-xr-x   2 root root 4096 Apr  9  2019 mnt
drwxr-xr-x   2 root root 4096 Apr  9  2019 opt
dr-xr-xr-x 116 root root    0 Dec 31 01:59 proc
dr-xr-x---   2 root root 4096 Apr  9  2019 root
drwxr-xr-x   2 root root 4096 Dec 31 01:59 run
lrwxrwxrwx   1 root root    8 Jul 26 23:51 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Apr  9  2019 srv
dr-xr-xr-x  13 root root    0 Dec 31 01:59 sys
drwxrwxrwt   1 root root 4096 Aug  3 18:39 tmp
drwxr-xr-x   1 root root 4096 Jul 26 23:51 usr
drwxr-xr-x   1 root root 4096 Jul 26 23:51 var
# cat AWS_FOR_FLUENT_BIT_VERSION
2.17.0

現時点では New Relic 謹製 Fluent Bit のバージョンは古めの Fluent Bit のバージョンが採用されていることが確認できました。

AWS for Fluent Bit のバージョン = Fluent Bit のバージョンではないので注意してください。

Fluent Bit 設定ファイル

タスク定義設定した箇所が/fluent-bit/etc/fluent-bit.confに反映されています。追加の設定ファイルなしにタスク定義で出力先を設定したときと同じ動作です。

参考: AWS FargateでFireLens(Fluent Bit)を最小構成で起動し、ECS ExecでFireLensコンテナに入ってみる | DevelopersIO

タスク定義の設定箇所抜粋

            "logConfiguration": {
                "logDriver": "awsfirelens",
                "secretOptions": [
                    {
                        "name": "apiKey",
                        "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:newrelic-license-key-Io2JZb"
                    }
                ],
                "options": {
                    "Name": "newrelic"
                }
            },

/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 sample5-dev-cluster
    Record ecs_task_arn arn:aws:ecs:ap-northeast-1:123456789012:task/sample5-dev-cluster/3ef36737831e46e39830e33765201278
    Record ecs_task_definition sample5-dev-web-taskdefinition:11

[OUTPUT]
    Name null
    Match firelens-healthcheck

[OUTPUT]
    Name newrelic
    Match web-firelens*
    apiKey ${apiKey_hogehoge}

ログ保存先が1つのサービス(New Relic Logs)だけのためタスク定義のoptionsの Key/Value により、[OUTPUT]の設定値を追加するシンプルな方法が取られていることが確認できました。

AWSサービス用プラグイン

AWS for Fluent Bit がベースのため基本的なAWSサービスを利用するプラグインは同梱されています。

  • CloudWatch Logs
  • Kinesis Data Steams
  • Kinesis Data Firehose
# pwd
/fluent-bit

# ls -l
total 79108
drwxr-xr-x 1 root root     4096 Nov 15 11:50 bin
-rw-r--r-- 1 root root 26243272 Aug  3 18:35 cloudwatch.so
drwxr-xr-x 2 root root     4096 Aug  3 18:38 configs
drwxr-xr-x 1 root root     4096 Nov 15 11:50 etc
-rw-r--r-- 1 root root 26032656 Aug  3 18:35 firehose.so
-rw-r--r-- 1 root root 28700336 Aug  3 18:34 kinesis.so
drwxr-xr-x 1 root root     4096 Aug  3 18:39 licenses
drwxr-xr-x 2 root root     4096 Aug  3 18:35 log
drwxr-xr-x 2 root root     4096 Aug  3 18:38 parsers

New Relic用プラグイン

New Relic Logs へログを送信するためにnewrelic-fluent-bit-outputプラグインを利用します。AWS for Fluent Bit イメージにデフォルトで同梱されていませんので別途追加が必要です。

New Relic 謹製の Fluent Bit イメージなので当然 New Relic用のプラグインが同梱されています。

# pwd
/fluent-bit/bin

# ls -l
total 34776
-rwxr-xr-x 1 root root 22335000 Aug  3 18:38 fluent-bit
-rw-r--r-- 1 root root 13273568 Nov 15 11:43 out_newrelic.so

out_newrelic.soのタイムスタンプが11月15日となっているのが注目する点でした。AWS for Fluent Bit は古いイメージを利用しているにもかかわらず、2021年12月31日時点で最新のNew Relic のプラグインが同梱されているようです。

プラグインのリリース日を確認すると最新が2021年11月15日でした。プラグインのリリースに合わせてイメージを更新していそうな感じがします。

New Relicプラグインの正確なバージョンはFluent Bit起動ログからは確認できませんでした。残念ながら最新バージョンと断定はできてはいません。

Fluent Bitの起動ログ

-----------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                  message                                                  |
|---------------|-----------------------------------------------------------------------------------------------------------|
| 1640915246344 | [1mFluent Bit v1.8.1[0m                                                                                 |
| 1640915246344 | * [1m[93mCopyright (C) 2019-2021 The Fluent Bit Authors[0m                                             |
| 1640915246344 | * [1m[93mCopyright (C) 2015-2018 Treasure Data[0m                                                      |
| 1640915246344 | * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd                                          |
| 1640915246344 | * https://fluentbit.io                                                                                    |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [engine] started (pid=1)                                                    |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [storage] version=1.1.1, initializing...                                    |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [storage] in-memory                                                         |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128 |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [cmetrics] version=0.1.1                                                    |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [input:tcp:tcp.0] listening on 127.0.0.1:8877                               |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [input:forward:forward.1] listening on unix:///var/run/fluent.sock          |
| 1640915246400 | [2021/12/31 01:47:26] [ info] [input:forward:forward.2] listening on 127.0.0.1:24224                      |
| 1640915246420 | [2021/12/31 01:47:26] [ info] [sp] stream processor started                                               |
| 1640916114285 | [2021/12/31 02:01:54] [engine] caught signal (SIGTERM)                                                    |
| 1640916114285 | [2021/12/31 02:01:54] [ info] [input] pausing forward.1                                                   |
| 1640916114285 | [2021/12/31 02:01:54] [ info] [input] pausing forward.2                                                   |
| 1640916114285 | [2021/12/31 02:01:54] [ warn] [engine] service will stop in 5 seconds                                     |
| 1640916118500 | [2021/12/31 02:01:58] [ info] [engine] service stopped                                                    |
-----------------------------------------------------------------------------------------------------------------------------

おわりに

New Relic 謹製 Fluent Bit イメージのベースイメージは比較的古いバージョンの AWS for Fluent Bit が採用されていました。

New Relic用プラグインはタイムスタンプからしておそらく最新のバージョンが同梱されているように見受けられ、Fluent Bit バージョンは意図的に古いバージョンに固定している意図が伺えます。

New Relic 謹製 Fluent Bit イメージはプライベートレジストリからの配布であることと、イメージタグに関する情報がないため任意のバージョンを指定できないのが難点に思えます。

今回の調査を踏まえ今後のアプローチとしては自前で AWS for Fluent Bit イメージに New Relic用プラグインを組み込んで管理するのがよいのかもしれないという方向性を確認できました。 また、New Relic 謹製 Fluent Bit イメージに設定ファイルを追加してカスタムログルーティングは原理的には可能だと思うので、実用性はあるのかは置いておいて興味本位で時間あるときに試してみたいと思います。