---
title: "Fluent Bitとは？読み方・Fluentdとの違い・AWSでの設定例【v5.1対応】"
url: "https://www.issoh.co.jp/tech/details/12612/"
published: 2026-06-17
updated: 2026-10-24
categories: ["監視・オブザーバビリティ"]
publisher: "株式会社一創"
---

# Fluent Bitとは？読み方・Fluentdとの違い・AWSでの設定例【v5.1対応】

Fluent Bit（フルエントビット）は、ログ・メトリクス・トレースを集めて加工し、CloudWatch LogsやOpenSearch、Grafana Lokiなどへ転送するC言語製のテレメトリエージェントです。表記は「fluentbit」「fluent-bit」と揺れますが、すべて同じソフトウェアを指します。この記事では2026年10月時点の最新版v5.1.5を前提に、仕組みと保守期限、Fluentdとの違い、実行して確かめたYAML設定とParserの落とし穴、ECS・EKSでの構成を扱います。

## まとめ｜Fluent Bitの要点と採用判断

- **何をするものか**：各サーバーやコンテナの横でログを収集し、Parser・Filterで整えて宛先へ送る常駐エージェントです。公式の比較表ではメモリ約450KB、組み込みプラグインは100種類以上です。
- **Fluentdとの関係**：同じFluentdエコシステムの一部で、どちらもCNCFのGraduatedプロジェクトです。ノードごとの収集はFluent Bit、複雑な加工と集約はFluentdという分担が基本です。
- **最新版と保守期限**：v5.1.5（2026年10月21日）。v5.0系は2026年11月30日まで保守され、v4.2系は2026年7月30日にEOLを迎えました。
- **設定形式**：v3.2からYAMLが標準で、従来の.conf形式（classic）は2026年末に非推奨になります。新規はYAMLで書いてください。
- **見落としやすい落とし穴**：v5.0.5以降のforward出力は、既定値のままFluentdへ送ると全レコードが捨てられます。また、Parserで数値型にした項目には`grep`や`rewrite_tag`の正規表現が一致しません。
- **AWSで使うなら**：aws-for-fluent-bitの`latest`と`stable`はFluent Bit 1.9.10を積んだ2.x系を指します。3.x系をバージョン番号タグで固定して使います（2026年10月22日公開の3.5.4でも同梱はv5.1.2）。

## Fluent Bitとは｜ログを収集・加工・転送するC製エージェント

Fluent Bitは、2014年にTreasure DataのFluentdチームが組み込みLinuxやゲートウェイ向けの軽量なログプロセッサとして作り始めたOSSです。コンテナの普及とともに入力・出力の対象が広がり、現在はログに加えてメトリクス・トレース・プロファイルまで扱います。OpenTelemetryのOTLPを入力・出力の両方でネイティブに扱えるため、OpenTelemetry Collectorの代わりに置く構成も取れます。

ライセンスはApache License 2.0で、ソフトウェア自体の費用はかかりません。公式サイトは累計150億回以上デプロイされたと記載しており、AWSのコンテナ向けログ転送（FireLens）やEKSのContainer Insightsでも採用されています。費用として見積もるのは、Fluent Bitを動かすCPU・メモリ（Fargateならログルーターを含めたタスクの割り当て）と、転送先のCloudWatch LogsやS3といった保存・検索サービスの料金です。

### 現行の保守ライン｜v5.1が現行・v5.0は2026年11月30日まで・v4.2はEOL

Fluent Bitは現行系列と保守系列に並行して修正版を出し、セキュリティ修正の期限をGitHubの[SECURITY.md](https://github.com/fluent/fluent-bit/blob/master/SECURITY.md)で公表しています。直近の版と期限は次のとおりです（2026年10月24日時点）。

| 系列   | 最新の修正版     | 公開日         | 保守期限           |
| ---- | ---------- | ----------- | -------------- |
| v5.1 | v5.1.5     | 2026年10月21日 | 未定（現行）         |
| v5.0 | v5.0.11    | 2026年10月9日  | 2026年11月30日    |
| v4.2 | v4.2.8（最終） | 2026年8月4日   | 2026年7月30日でEOL |

v5.0系の保守はあと約1か月で切れるため、これから構築するならv5.1系一択です。v5.1ではForward入力などのマルチスレッド受信（`workers`）、入力ごとの流量上限（`rate_gate`）、FIPSモード、Google Cloud Storage出力が加わりました。

v5.1系の中でも、ネットワークから受信する入力を開けているならv5.1.4以降に上げてください。[v5.1.4](https://github.com/fluent/fluent-bit/releases/tag/v5.1.4)ではOTLP gRPC受信時の無制限な伸長とForward入力のmsgpack展開量に上限が入り、[v5.1.5](https://github.com/fluent/fluent-bit/releases/tag/v5.1.5)ではForward入力のトレース復号の迂回、Loki出力のHTTPヘッダーへのCRLF注入、`copytruncate`方式でローテーションされたファイルを`tail`が読み逃す不具合が直っています。

## Fluent Bitの仕組み｜Input・Parser・Filter・Buffer・Router・Output

Fluent Bitは受け取ったデータを「レコード（1件のログ）」単位で扱い、次の順に処理します。

1. **Input**：ファイル末尾の追跡（`tail`）、systemdジャーナル、Forwardプロトコル、HTTP、OTLPなどからデータを受け取り、レコードに**タグ**を付けます。
2. **Parser**：JSONや正規表現で、1行の文字列を構造化されたキーと値に分解します。
3. **Filter**：`grep`による除外、`modify`によるキー追加、`kubernetes`によるPod名やラベルの付与などを行います。
4. **Buffer**：出力できるまでデータをチャンク単位でメモリまたはファイルに保持します。
5. **Router**：出力側の`match`に書いたパターンとタグを照合し、送り先を決めます。1件を複数の出力へ送ることもできます。
6. **Output**：CloudWatch Logs・S3・OpenSearch・Lokiなどへ送信し、失敗したら再試行します。

設計で最初に決めるのはタグの命名です。`app.web`、`app.batch`、`host.syslog`のように階層を切っておくと、出力側で`app.*`だけをCloudWatch Logsへ、`host.*`だけをS3へ、と振り分けを書けます。

YAML形式では、入力や出力に**processors**を直接ぶら下げて加工することもできます。processorsは特定の入力・出力に付属する処理で、ログだけでなくメトリクスやトレースにも使えます。**classic形式（.conf）ではprocessorsを書けません**。これもYAMLへ移る理由のひとつです。

## FluentdとFluent Bitの違い｜比較表と併用時の注意点

公式ドキュメント「[Fluentd and Fluent Bit](https://docs.fluentbit.io/manual/about/fluentd-and-fluent-bit)」の比較表から抜粋したものです。

| 項目            | Fluentd            | Fluent Bit          |
| ------------- | ------------------ | ------------------- |
| 主な設置先         | コンテナ・サーバー          | 組み込みLinux・コンテナ・サーバー |
| 実装言語          | CとRuby             | C                   |
| メモリ           | 60MB超              | 約450KB              |
| 依存関係          | Ruby gemで、他のgemに依存 | プラグインが要求しない限り無し     |
| プラグイン         | 外部プラグイン1,000種類以上   | 組み込み100種類以上         |
| OpenTelemetry | プラグイン経由            | OTLPの入出力にネイティブ対応    |
| ライセンス         | Apache License 2.0 | Apache License 2.0  |

「約450KB」は公式表の値で、実際の使用量は入力の量とバッファ設定で大きく変わります。サイジングの根拠にはせず、実際の流量で計測してください。後述の`mem_buf_limit`（入力ごとのメモリバッファ）や`storage.max_chunks_up`（メモリに載せるチャンク数）はバッファの上限で、プロセス全体のメモリ上限ではありません。コンテナではメモリのlimitも別に設定します。

### 選び分けの基準｜ノードの収集はFluent Bit、集約はFluentd

Kubernetesのノードごと、ECSのタスクごとに常駐させる収集役は、メモリの小さいFluent Bitが向いています。公式ドキュメントも、クラウド事業者がFluentdからFluent Bitへ移ってきたと書いています。Fluentdを残す理由になるのは、Fluent Bitに無い外部プラグインが必要な場合や、Rubyで書いた独自の加工処理がすでに資産になっている場合です。Fluentd側の設定とfluent-package v6への移行は[Fluentdとは？設定ファイルの書き方とfluent-package v6移行の判断](/tech/details/17743/)で扱っています。

### v5.0.5以降のforward出力｜Fluentdへ送ると全件破棄される既定値

Fluent Bitで収集してFluentdで集約する2段構成では、Fluent Bitの`forward`出力を使います。ここで`retain_metadata_in_forward_mode`の既定値が`false`から`true`に変わりました。公式ドキュメントはv5.0.4からと書いていますが、タグ付きのソースコードではv5.0.4の定義もまだ`"false"`で、`"true"`になったのはv5.0.5（PR #11756）からです。v5.1.5の[forward.c](https://github.com/fluent/fluent-bit/blob/v5.1.5/plugins/out%5Fforward/forward.c)でも既定値は`"true"`のままです。

この値が`true`だと、Fluent Bitはイベントのメタデータを拡張形式で埋め込んで送ります。Fluentdはこの形式を解釈できず、`skip invalid event`という警告を出してレコードを捨てます。公式の[forward出力のドキュメント](https://docs.fluentbit.io/manual/data-pipeline/outputs/forward)は、この場合**全レコードが破棄される**と明記しています。警告は受信側のFluentdのログにしか出ないため、Fluent Bit側だけを監視していると欠損に気づけません。Fluentd側の受け入れ対応（PR #5411）は2026年7月7日にmasterへ取り込まれましたが、2026年10月24日時点の最新リリースであるv1.19.4（9月28日公開）には含まれていません。

Fluentdへ送る出力には、次のように明示的に`false`を書きます。

```
pipeline:
  outputs:
    - name: forward
      match: '*'
      host: fluentd-aggregator
      port: 24224
      retain_metadata_in_forward_mode: false
```

受信側もFluent Bitであれば既定値のままで構いません。

## 設定ファイルの書き方｜YAMLが標準・classicは2026年末に非推奨

公式ドキュメントでは、YAMLがv3.2からの標準形式で、classic形式（拡張子.conf）は2026年末に非推奨になると案内しています。YAMLの基本構造は、全体設定の`service`と、入力・フィルター・出力を並べる`pipeline`の2つで、独自のParserを使うときは`parsers`を加えます。

### インストール｜Linux・Kubernetes・Docker・macOS

LinuxサーバーとKubernetesには公式の導入手段があります。Dockerなら公式イメージ`fluent/fluent-bit`に設定ファイルをマウントして`-c`で指定し、macOSならHomebrewで入ります。

```
# Linux（パッケージリポジトリを登録して導入）
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh

# Kubernetes（DaemonSetとして導入）
helm repo add fluent https://fluent.github.io/helm-charts
helm upgrade --install fluent-bit fluent/fluent-bit

# macOS
brew install fluent-bit
```

### 最小構成の実行例｜dummy入力からstdout出力まで

次の設定は、2件のテストログを生成し、`level`が`debug`のものを除外し、残りに`env`キーを加えて標準出力へJSONで出すものです。外部サービスが要らないため、タグの振り分けやフィルターの効き方をこの形で確かめてから本番の出力先に差し替えると、切り分けが速くなります。

```
# fluent-bit.yaml
service:
  flush: 1
  log_level: info

pipeline:
  inputs:
    - name: dummy
      tag: app.web
      dummy: '{"level":"info","path":"/api/orders","status":200}'
      samples: 1
    - name: dummy
      tag: app.web
      dummy: '{"level":"debug","path":"/healthz","status":200}'
      samples: 1

  filters:
    - name: grep
      match: 'app.*'
      exclude: level ^debug$
    - name: modify
      match: 'app.*'
      add: env production

  outputs:
    - name: stdout
      match: 'app.*'
      format: json_lines
```

macOSのHomebrewで入れたFluent Bit 5.1.2で`fluent-bit -c fluent-bit.yaml`を実行すると（2026年10月24日）、標準出力に届いたのは次の1件だけでした。`debug`のレコードは`grep`で落ち、`env`が追加されています。

```
{"date":1792782041.49424,"level":"info","path":"/api/orders","status":200,"env":"production"}
```

### 起動前の検証｜dry-runオプションでプロパティ名の誤りを検出

`fluent-bit --dry-run -c fluent-bit.yaml`は、起動せずに設定だけを検証します。v4.2から構文だけでなくプロパティ名まで検査するようになり、それ以前は実行時まで分からなかった綴りの誤りを事前に拾えます。上の設定の`exclude`を`exlude`と打ち間違えた版で実行した結果が次です（起動バナーと時刻は省略）。

```
$ fluent-bit --dry-run -c typo.yaml
[error] [config] grep: unknown configuration property 'exlude'. The following properties are allowed: regex, exclude, and logical_op.
[error] [reload] check properties and additonal vaildations for filter plugins is failed
$ echo $?
1
```

正しい設定なら`configuration test is successful`と出て終了コード0で終わります。CIでこのコマンドを実行し、終了コードが0以外なら配布を止める仕組みにしておくと、設定ミスでログが止まる事故を防げます。ただし、次の章で扱う「型の不一致」はdry-runでは検出できません。

## アクセスログを解析して振り分ける｜tail・Parser・rewrite\_tag

実運用で最初に書くのは、ファイルに出ているログを`tail`で読み、Parserで項目に分け、条件で宛先を変える設定です。nginx形式のアクセスログを例に、ヘルスチェックを捨て、5xxだけを別の宛先へ回します。

### regexパーサーの設定例｜5xxレスポンスの別タグへの振り分け

入力には次の3行を使います。200と503のリクエスト、Kubernetesのヘルスチェックです。

```
192.0.2.10 - - [24/Oct/2026:10:00:01 +0900] "GET /api/orders HTTP/1.1" 200 512 "-" "curl/8.7.1"
192.0.2.11 - - [24/Oct/2026:10:00:02 +0900] "POST /api/orders HTTP/1.1" 503 87 "-" "curl/8.7.1"
192.0.2.12 - - [24/Oct/2026:10:00:03 +0900] "GET /healthz HTTP/1.1" 200 2 "-" "kube-probe/1.34"
```

```
service:
  flush: 1
  log_level: info

parsers:
  - name: nginx_access
    format: regex
    regex: '^(?<remote>[^ ]*) [^ ]* [^ ]* \[(?<time>[^\]]*)\] "(?<method>\S+) (?<path>[^ ]*) [^"]*" (?<code>\d{3}) (?<size>\d+) "[^"]*" "(?<agent>[^"]*)"$'
    time_key: time
    time_format: '%d/%b/%Y:%H:%M:%S %z'
    types: size:integer

pipeline:
  inputs:
    - name: tail
      path: /var/log/nginx/access.log
      tag: nginx.access
      read_from_head: true
      parser: nginx_access

  filters:
    - name: grep
      match: 'nginx.*'
      exclude: agent ^kube-probe
    - name: rewrite_tag
      match: 'nginx.access'
      rule: '$code ^5\d\d$ nginx.error false'

  outputs:
    - name: stdout
      match: 'nginx.access'
      format: json_lines
    - name: file
      match: 'nginx.error'
      path: /var/log/fluent-bit
      mkdir: true
      file: errors.log
      format: plain
```

`rewrite_tag`の`rule`は「キー、正規表現、新しいタグ、元のレコードを残すか」の4つを空白区切りで書きます。最後を`false`にすると、5xxのレコードは`nginx.error`だけに流れ、`nginx.access`からは消えます。`read_from_head: true`は既存の行も先頭から読む指定で、本番では読み取り位置を記録する`db`と組み合わせます。`file`出力の`mkdir`は既定が`false`で、出力先のディレクトリが無いと書き込めません。実行ユーザーには、入力ファイルの読み取り権限と出力先への書き込み権限が要ります。

上の3行を入れたファイルを、入出力のパスだけ検証用のディレクトリに替えてFluent Bit 5.1.2で読ませた結果です。標準出力には200の1件だけが出て、503の行は`errors.log`に書かれ、ヘルスチェックはどちらにも出ませんでした。

```
$ fluent-bit -c nginx.yaml
{"date":1792803601.0,"remote":"192.0.2.10","method":"GET","path":"/api/orders","code":"200","size":512,"agent":"curl/8.7.1"}

$ cat errors.log
{"remote":"192.0.2.11","method":"POST","path":"/api/orders","code":"503","size":87,"agent":"curl/8.7.1"}
```

### 数値型にした項目は正規表現に一致しない｜grep・rewrite\_tagの落とし穴

上の設定で`types`を`code:integer size:integer`にすると、ステータスコードが数値として出力され、集計しやすくなります。ところが同じログで実行すると、503のレコードが`nginx.error`へ回らず、200と一緒に標準出力へ出ました。エラーも警告も出ず、`--dry-run`も成功します。

原因はレコードを照合する共通処理にあります。`grep`と`rewrite_tag`はどちらも同じ照合関数を使っており、v5.1.5の[src/flb\_ra\_key.c](https://github.com/fluent/fluent-bit/blob/v5.1.5/src/flb%5Fra%5Fkey.c)は、値が文字列でなければ照合せずに「一致しない」を返す実装です。数値・真偽値・null・入れ子のオブジェクトには、正規表現が当たりません。

ステータスコードやレイテンシーで振り分けたい項目は、Parserで数値型にしないでください。数値として保存したいなら、振り分けを済ませた後の出力先（OpenSearchのマッピングやCloudWatch Logs Insightsのクエリ）で型を変えるか、Lua（`lua`フィルター）で数値のまま比較します。JSONで出力するアプリのログも、数値はそのまま数値型になります。`{"status":503}`を`regex: status ^503$`の`grep`に通すと1件も残らず、値を`"503"`と文字列にした場合だけ残りました。

## ログの欠損を減らすバッファ設計｜mem\_buf\_limit・filesystem・DLQ

出力先が落ちたり遅くなったりすると、Fluent Bitには送れないデータが溜まります。公式ドキュメントはこれをバックプレッシャと呼び、入力ごとのバッファ方式で対処が変わります。

| 方式          | 設定                       | 上限に達したとき    |
| ----------- | ------------------------ | ----------- |
| メモリのみ（既定）   | mem\_buf\_limit          | その入力を一時停止   |
| ファイル併用      | storage.type: filesystem | ファイルへ退避して継続 |
| メモリのリングバッファ | storage.type: memrb      | 古いチャンクから破棄  |

メモリのみの方式で`mem_buf_limit`に達すると、Fluent Bitはその入力を一時停止し、ログに`paused (mem buf overlimit)`と出します。`tail`入力は読み取り位置で止まるだけです。ただし停止中にローテーションされ、`rotate_wait`（既定5秒）を過ぎたファイルは読み残しが出ることがあります。HTTP系の入力（http・splunk・elasticsearch・opentelemetry・prometheus\_remote\_write）はもっと厳しく、停止中に届いた接続を受け付けてすぐ閉じ、処理中のリクエストも破棄します。送信側が再送しなければ、そのデータは失われたまま。アプリからOTLPで直接受ける構成なら、送信側SDKのリトライ設定まで見直す必要があります。

取りこぼしを許容できないログは、ファイル併用にします。

```
service:
  storage.path: /var/lib/fluent-bit/storage/
  storage.max_chunks_up: 128
  storage.keep.rejected: on
  storage.rejected.path: rejected
  storage.rejected.limit: 500M

pipeline:
  inputs:
    - name: tail
      path: /var/log/app/*.log
      db: /var/lib/fluent-bit/tail-app.db
      tag: app.file
      storage.type: filesystem
  outputs:
    - name: cloudwatch_logs
      match: 'app.*'
      region: ap-northeast-1
      log_group_name: /app/production
      log_stream_prefix: node-
      storage.total_limit_size: 5G
```

`db`は読み取り位置を記録するファイルで、無いと再起動のたびに位置を引き継げません。ほかに効いている設定は3つです。`storage.max_chunks_up`は、ファイル併用の全入力で共有する「同時にメモリへ載せるチャンク数」の上限です。`storage.total_limit_size`は出力ごとのキューの上限で、**超えると最も古いチャンクから捨てられます**。ディスクを守る代わりに古いログを失う設定なので、出力先の障害が何時間続いたら溢れるかをログ量から逆算して決めてください。

`storage.keep.rejected: on`はデッドレターキュー（DLQ）で、v4.2から使えます。出力先が回復不能なエラーを返したとき、再試行の上限に達したとき、再試行を無効にしているときに、送れなかったチャンクを`storage.path`配下の`rejected`ディレクトリへ保存します。`storage.rejected.limit`を書かないとDLQの容量は無制限で、保存されたファイルは手で消すまで残ります。上限を書いた場合は、上限に達した後のチャンクはDLQへ保存されず、警告ログが出るだけです。ディスク使用量とこの警告の監視、削除の運用を決めてから有効にしてください。

## AWSでFluent Bitを使う構成｜FireLens・EKS・aws-for-fluent-bit

AWSでは、AWSがビルドして配布するコンテナイメージaws-for-fluent-bitを使うのが一般的です。ECSではFireLensのサイドカーとして、EKSではDaemonSetとして動かします。どちらを選ぶかの前提になるECS・EKS・Fargateの違いは[AWSのコンテナサービス比較｜ECS・EKS・Fargate・Lambdaの選び方とExpress Modeで動かす手順](/tech/details/17869/)で整理しています。

### aws-for-fluent-bitの版｜latestとstableは1.9.10を積んだ2.x系

aws-for-fluent-bitには、Amazon Linux 2ベースの2.x系とAmazon Linux 2023ベースの3.x系があり、同梱されているFluent Bitの版がまったく違います。

| 系列  | 最新版（公開日）           | ベースOS             | 同梱Fluent Bit | サポート          |
| --- | ------------------ | ----------------- | ------------ | ------------- |
| 3.x | 3.5.4（2026年10月22日） | Amazon Linux 2023 | 5.1.2        | 2028年まで       |
| 2.x | 2.34.3.20261020    | Amazon Linux 2    | 1.9.10       | 2026年6月30日に終了 |

注意すべきはタグの意味です。[READMEは](https://github.com/aws/aws-for-fluent-bit)`latest`タグを「2.x系の最新」と定義しており、安定版を示す`AWS_FOR_FLUENT_BIT_STABLE_VERSION`ファイルも2026年10月24日時点で`2.34.3.20261020`を指しています。`latest`や`stable`を指定すると、Fluent Bit 1.9.10が動きます。1.9.10では、v2.1で入ったprocessorsも、v4.2で入ったDLQ（前述の`storage.keep.rejected`）も使えません。

2.x系はサポート終了後もAmazon Linux 2ベースの再ビルドが続いていますが、同梱のFluent Bitは1.9.10のままです。AWS自身も3.x系への移行を勧め、本番ではタグをバージョン番号で固定するよう推奨しています。ただしstable指定はまだ2.x系にしか付いておらず、READMEはstable指定前の版をテスト環境やステージングで使うよう求めています。3.x系はステージングで検証してから、本番の版として固定するのが安全です。`latest`・`stable`・`3`はいずれも中身が入れ替わるタグなので、デプロイの途中で版が混在する原因になります。

もう1つ、AWS版は本家より遅れます。3.5.0で同梱がFluent Bit 5.1.2に上がった後、3.5.1から3.5.4までの4回はベースOSのパッケージ更新だけでした。前述のv5.1.4・v5.1.5の修正は、2026年10月24日時点のaws-for-fluent-bitには入っていません。同梱の版はリポジトリの`linux.version`ファイルに書かれているので、イメージを上げる前にここで確かめてください。OTLPやForwardの受信ポートを外部に開けていて修正をすぐ取り込みたい場合は、本家の`fluent/fluent-bit`イメージを使う選択肢もあります。ただしFireLensで使うGo製プラグイン（後述の`cloudwatch`など）は本家イメージに入っていません。

### ECS・FargateはFireLensのサイドカー｜awsfirelensドライバーの設定

ECSでは、タスク定義にログルーター用のFluent Bitコンテナを1つ加え、アプリ側のコンテナのログドライバーを`awsfirelens`にします。`options`に書いたキーと値がFluent BitのOUTPUT設定として生成され、`match`はFireLensが自動で付けます。次はタスク定義のうち`containerDefinitions`だけの抜粋で、Fargateではこのほかにタスク全体の`cpu`・`memory`、`networkMode: awsvpc`、タスクロールなどを書きます。

```
{
  "containerDefinitions": [
    {
      "name": "log_router",
      "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:3.5.4",
      "essential": true,
      "firelensConfiguration": { "type": "fluentbit" }
    },
    {
      "name": "app",
      "image": "example/app:1.0.0",
      "essential": true,
      "logConfiguration": {
        "logDriver": "awsfirelens",
        "options": {
          "Name": "cloudwatch_logs",
          "region": "ap-northeast-1",
          "log_group_name": "/ecs/app",
          "log_stream_prefix": "app-",
          "auto_create_group": "true",
          "log_retention_days": "30"
        }
      }
    }
  ]
}
```

CloudWatch Logsへ書き込むIAM権限は、タスク定義の`taskRoleArn`に指定するタスクロールに付けます。FireLensにはいくつか制約があります。Windowsコンテナでは使えません。独自の設定ファイルを読ませる`config-file-type`は、Fargateでは`file`（イメージ内のファイル）しか指定できず、S3上の設定を使うにはaws-for-fluent-bitの`init`タグ付きイメージが必要です。また`/fluent-bit/etc/fluent-bit.conf`はFireLensの予約パスなので、独自の設定は別のパスに置きます。

### EKSはDaemonSet｜Container Insightsのロググループ構成

EKSでは、各ノードにFluent BitをDaemonSetで1つずつ置き、`/var/log/containers`配下のコンテナログを`tail`で読みます。CloudWatchの[Container Insightsの手順](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-logs-FluentBit.html)で導入すると、次の3つのロググループが作られます。

- `/aws/containerinsights/クラスター名/application`：`/var/log/containers`の全コンテナログ
- `/aws/containerinsights/クラスター名/host`：`/var/log/dmesg`・`/var/log/secure`・`/var/log/messages`
- `/aws/containerinsights/クラスター名/dataplane`：kubelet・kube-proxy・dockerのジャーナル

以前のContainer InsightsでFluentdのDaemonSetを入れていた場合、AWSのドキュメントはFluent Bitを入れた直後にFluentdをアンインストールするよう求めています。containerdランタイムでFluentdが正しく動いていない場合は、Fluent Bitより先にFluentdを消します。残しておくと、Fluentdのエラーログを、Fluent Bitが拾い続けます。なお、この手順の公式マニフェストは2026年10月24日時点でもイメージが`aws-for-fluent-bit:3.0.1`（Fluent Bit v4.1.1、2026年2月28日にEOL）に固定されています。`image`の行を現行の3.x系に書き換えてから適用してください。クラスター全体の監視設計は[Kubernetes監視・モニタリングの設計｜メトリクス・ログ・アラート閾値の実装判断](/tech/details/15303/)を参照してください。

### CloudWatch Logsへの出力｜cloudwatch\_logsプラグインとIAM権限

aws-for-fluent-bitには、CloudWatch Logs向けの出力が2つ入っています。初期に作られたGo製の`cloudwatch`と、Fluent Bit本体に取り込まれたC製の`cloudwatch_logs`です。AWSは、C製のほうがリソース使用量が少なくスループットも高いと説明しています。新規なら`cloudwatch_logs`が第一候補です。Go製から切り替えるときは、ロググループ名とストリーム名のテンプレートの書き方が違います。Go製は`log_group_name`に`$(ecs_task_id)`などのECSメタデータを直接書けますが、C製は`log_group_template`・`log_stream_template`に`$変数`記法で書き、埋め込めるのはログのJSONにある値だけです。逆に`workers`や`auto_retry_requests`はC製でだけ使えます。

公式ドキュメントが挙げるIAM権限は`logs:CreateLogStream`・`logs:CreateLogGroup`・`logs:PutLogEvents`・`logs:PutRetentionPolicy`の4つです。v5.1.5のソースでは、`CreateLogGroup`は`auto_create_group`が`true`でロググループが見つからないときに、`PutRetentionPolicy`はその作成の直後に`log_retention_days`を指定していたときにだけ呼ばれます。ロググループを事前に作る運用なら、残りの2つで足ります。`auto_create_group`の既定値は`false`なので、ロググループを事前に作らない運用なら`true`にし、`log_retention_days`で保持期間も同時に決めます。保持期間を決めずに自動作成すると、ロググループは無期限保存になり、保存料金が積み上がります。タスクロールやロググループをTerraformなどでまとめて設計する場合は、[AWS・Google Cloud・Azureのインフラ構築支援](/service/system/aws/)でも相談を受けています。

## CloudWatch以外の出力先｜S3・OpenSearch・Loki・Datadog

出力プラグインは`name`に指定する名前で選びます。代表的なものは次のとおりです。

| 宛先                   | name                      | 主な用途                           |
| -------------------- | ------------------------- | ------------------------------ |
| Amazon S3            | s3                        | 長期保管・監査用アーカイブ                  |
| Amazon Data Firehose | kinesis\_firehose         | S3やRedshiftへの配送                |
| OpenSearch           | opensearch                | 全文検索・ダッシュボード                   |
| Elasticsearch        | es（v5.1からelasticsearchも可） | 全文検索・ダッシュボード                   |
| Grafana Loki         | loki                      | ラベルで絞り込むログ基盤                   |
| Datadog              | datadog                   | SaaSでの一元監視                     |
| OTLP対応の基盤            | opentelemetry             | OpenTelemetry Collectorや各社SaaS |

1件のレコードは複数の出力に`match`できるため、「全量をS3に安く保管し、エラーだけをOpenSearchやDatadogへ送る」という分け方が取れます。取り込み量課金のSaaSでは、この分け方がそのまま費用の差になります。OpenSearchとElasticsearchのどちらを受け側にするかは[ElasticsearchとOpenSearchの違い｜ライセンス・API互換・機能差から移行先を決める](/tech/details/17013/)、Lokiの構成は[Grafana Lokiとは？仕組み・Alloyでの導入手順とLogQLの書き方【v3.7】](/tech/details/9570/)が詳しいです。

## ほかのログエージェントとの比較｜Vector・Filebeat・OTel Collector・Alloy

ログ収集エージェントはFluent Bitのほかにも選択肢があります。2026年10月24日時点の最新版と、開発元・実装言語・ライセンスを並べました。

| エージェント                 | 開発元                 | 言語   | ライセンス                            | 最新版     |
| ---------------------- | ------------------- | ---- | -------------------------------- | ------- |
| Fluent Bit             | Fluentプロジェクト（CNCF）  | C    | Apache 2.0                       | 5.1.5   |
| Vector                 | Datadog             | Rust | MPL 2.0                          | 0.60.0  |
| Filebeat               | Elastic             | Go   | Elastic License（-ossはApache 2.0） | 9.5.5   |
| OTel Collector Contrib | OpenTelemetry（CNCF） | Go   | Apache 2.0                       | 0.163.0 |
| Grafana Alloy          | Grafana Labs        | Go   | Apache 2.0                       | 1.21.2  |

受け側の製品が決まっているなら、その製品の標準エージェントが最短です。Elasticsearchへ送るならFilebeat、Grafana LokiならAlloyです。Lokiの旧エージェントPromtailは、[Grafanaの告知](https://grafana.com/docs/loki/latest/send-data/promtail/)どおり2026年3月2日にEOLとなり、以後の開発はAlloyに移りました。Promtailで動いている環境は、Fluent BitかAlloyへの移行が必要です。宛先が複数ある、またはAWSの標準構成に乗せたい場合はFluent Bitが有利です。Vectorは変換用の独自言語（VRL）で複雑な加工を書ける点が強みですが、版は0.x系のままで、2026年8月から10月だけでも0.58・0.59・0.60とマイナー版が3回上がっています。版ごとの変更点を追い続ける運用が要ります。

### Fluent Bitを選ばない方がよい場面｜OpenTelemetry Collectorとの分担

トレースとメトリクスをすでにOpenTelemetry Collectorで集めている環境に、ログのためだけにFluent Bitを足すと、エージェントが2種類になり、設定ファイル、版の追従、エージェント自身の監視をそれぞれ2系統持つことになります。Collector（Contrib版）の`filelog`レシーバーでファイルのログも読めるので、まずCollectorに寄せられないかを検討します。判断材料は[OpenTelemetryのログ実装｜直接送信とfilelog receiverの選び分け](/tech/details/16555/)にまとめています。

Fluent Bitが優位なのは、ノードあたりのメモリ枠が厳しい場合、ECS FireLensやContainer InsightsのようにAWSの標準構成に乗る場合、syslogやsystemdなど従来型のログ源が混在する場合です。ログ基盤全体でのエージェントの位置づけは[ログ集約とは？収集・転送・保存・可視化の仕組みとエージェント選定・導入判断を実装目線で解説【2026年版】](/tech/details/15711/)で比較しています。

## よくある質問

### Fluent Bitの読み方は？

「フルエントビット」と読みます。表記は「Fluent Bit」が正式で、コマンド名やパッケージ名は「fluent-bit」です。

### FluentdとFluent Bitはどちらを選べばよいですか？

各ノードに常駐させる収集役はFluent Bit、外部プラグインやRubyの独自処理が要る集約役はFluentdです。併用時はforward出力の`retain_metadata_in_forward_mode`を`false`にします。

### AWSではどのイメージを使えばよいですか？

aws-for-fluent-bitの3.x系を、`3.5.4`のようなバージョン番号タグで固定して使ってください。`latest`と`stable`は2026年10月時点でFluent Bit 1.9.10を積んだ2.x系を指し、2.x系は2026年6月30日にサポートを終えています。

### Fluent BitにEOLはありますか？

系列ごとの保守期限はGitHubのSECURITY.mdで公表されています。2026年10月24日時点では、v5.1系が現行（期限は未定）、v5.0系は2026年11月30日までセキュリティ修正の対象、v4.2系は2026年7月30日にEOLです。v5.0系以前を使っているならv5.1系へ上げてください。設定面では、classic形式（.conf）の設定ファイルが2026年末に非推奨になります。

### Fluent BitはWindowsでも動きますか？

動きます。ZIPとEXEのインストーラー（MSIも提供）、Docker HubのWindowsコンテナがあります。ただし全プラグインがWindowsに対応しているわけではなく、ECSのFireLensもWindowsコンテナでは使えません。

## 関連記事

- [Fluentdとは？設定ファイルの書き方とfluent-package v6移行の判断](/tech/details/17743/)
- [ログ集約とは？収集・転送・保存・可視化の仕組みとエージェント選定・導入判断を実装目線で解説【2026年版】](/tech/details/15711/)
- [OpenTelemetryのログ実装｜直接送信とfilelog receiverの選び分け](/tech/details/16555/)
- [Grafana Lokiとは？仕組み・Alloyでの導入手順とLogQLの書き方【v3.7】](/tech/details/9570/)
- [AWSのコンテナサービス比較｜ECS・EKS・Fargate・Lambdaの選び方とExpress Modeで動かす手順](/tech/details/17869/)

---

出典: [Fluent Bitとは？読み方・Fluentdとの違い・AWSでの設定例【v5.1対応】](<https://www.issoh.co.jp/tech/details/12612/>)（株式会社一創）
