Fluentdを利用して、Dockerコンテナのログを別システムへ転送する

# 概要
Dockerコンテナにて出力されているログをFluentdにて収集し、別システムへ転送するためのセットアップ手順を記載します。

# 環境
本手順で取り扱う内容は、次の環境にて確認しています。
* Dockerコンテナ
マシン：Amazon EC2
OS：Ubuntu 24.04

* Fluentd Server
マシン：Amazon EC2
OS：Ubuntu 24.04

構成図は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/4834aee1-ac7d-a610-7cb2-57db052bd3a7.png)


* Fluentdをログ収集＆転送機能として利用します。
* 本記事ではFluentdはコンテナとして動作させる手順を案内していますが、OSに直接インストールする形でも動作するはずです。
* ログ収集対象のDockerコンテナが複数台存在する場合もあると思いますが、本記事では話をシンプルにするために１台構成としています。

# 前提条件
ログ収集対象のDockerコンテナが既に稼働していること。

# 手順
## Fluentdセットアップ
本手順は、Fluentdを動作させるマシン上にて作業して下さい。
### 通信設定
セキュリティグループのインバウンドルールにて、ログ収集対象コンテナが動作しているマシンからのTCP 24224 Port接続を許可して下さい。

### Fluentdコンテナインストール
Fluentd用のディレクトリを作成します。
次のコマンドでは`fluentd`という名前のディレクトリを作成していますが、任意の名前で構いません。

```
$ mkdir fluentd
$ cd fluentd
```

`compose.yaml`を作成し、編集します。
```
$ vi compose.yaml
```

編集する内容のサンプルが次になります。
Fluentdのバージョンが`v1.18.0-1.0`となっていますが、こちらは2024/12/26時点での最新バージョンになるので、[DockerHubのページ](https://hub.docker.com/r/fluent/fluentd/)にて確認いただき、適宜書き換えて下さい。
```
services:
  fluentd:
    container_name: fluentd
    image: fluent/fluentd:v1.18.0-1.0
    restart: unless-stopped
    volumes:
      - ./config:/fluentd/etc
    ports:
      - 24224:24224
```

`compose.yaml`が存在するディレクトリにて、次のコマンドを実行して下さい。
```
$ mkdir config
$ cd config
```

`fluent.conf`を作成し、編集します。
```
$ vi fluent.conf
```

編集する内容のサンプルが次になります。
各パラメータの詳細が知りたい場合は、ドキュメントを参照して下さい。
[in_forward Input plugin](https://docs.fluentd.org/input/forward)
[Http output plugin](https://docs.fluentd.org/output/http)
```
<source>
  @type forward
</source>

<match docker.**>
  @type http
  endpoint <YOUR-ENDPOINT>
  open_timeout 2
  <format>
    @type json
  </format>
  content_type application/json
  headers {"Authorization": "Bearer <YOUR-ACCESSTOKEN>"}
  <buffer>
    chunk_limit_records 1
  </buffer>
</match>
```

編集が完了したら、Fluentdコンテナを起動します。
`compose.yaml`が存在するディレクトリに移動し、`docker compose up -d`を実行して下さい。
```
$ cd ../
$ docker compose up -d
```

Fluentdコンテナが起動していることを確認して下さい。
```
$ docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED             STATUS          PORTS                                                      NAMES
f519dfd9d0d6   fluent/fluentd:v1.18.0-1.0   "tini -- /bin/entryp…"   About an hour ago   Up 14 minutes   5140/tcp, 0.0.0.0:24224->24224/tcp,  :::24224->24224/tcp   fluentd

```

以上でFluentdコンテナのセットアップは完了です。

## ログ収集対象コンテナの設定変更
本手順は、ログ収集対象コンテナが稼働しているマシンにて作業して下さい。

### コンテナがdocker composeにて動作している場合
`compose.yaml`の内容を編集する必要があります。
対象コンテナのセクションにて、次の内容を挿入して下さい。
`<FluentdマシンのIP>`となっている箇所は、先ほどセットアップしたFluentdマシンのIPを指定して下さい。

```
    logging:
      driver: "fluentd"
      options:
        fluentd-address: "<FluentdマシンのIP>:24224"
        tag: "docker.{{.Name}}"
```

`compose.yaml`が存在するディレクトリにて、次のコマンドを実行し、変更内容を反映させてください。
```
$ docker compose up -d
```

### コンテナがdocker composeにて動作していない場合
docker composeにて動作していない場合は、ログのオプションを付与した上で、再度起動させてください。次のコマンドはnginxコンテナのサンプルになります。
```
docker run -d \
  --log-driver=fluentd \
  --log-opt fluentd-address=<FluentdマシンのIP>:24224 \
  --log-opt tag=docker.{{.Name}} \
  nginx:latest
```

## 動作確認
転送先システムにて、ログが受信できていることを確認して下さい。
もし、受信できていない場合、次のコマンドにてFluentdのログを確認することが有効です。
```
$ docker logs fluentd -f
```

# 補足
* ログ収集対象コンテナから出力されるログをFluentdに転送しても、"docker logs <コンテナ名> -f"で、コンテナのログは引き続き閲覧可能です。

# 参考
https://docs.fluentd.org/input/forward

https://docs.fluentd.org/output/http

https://hub.docker.com/r/fluent/fluentd/

https://qiita.com/myoshimi/items/87fca5a4f9b1df78bb48#docker-composeyml