FluentdをDocker Composeで試す

## はじめに

[前回記事](https://qiita.com/t13801206/items/af876cbfd509c123d723)では、ラズパイのsyslogをTftpd64で閲覧した

Tftpd64は手軽で動作確認程度には使えるけれども、監視対象が多くなると手に負えなくなる（ことは火を見るよりも明らか）
いずれは、**ラズパイのsyslogをもっとグラフィカルに見たい**

今回は、その足掛かりとして**EFKログ基盤**を構築し
まずはHTTPアクセスのログが採れるか試す

### EFKログ基盤とは？

複数ソースから集めたデータを見やすくしてくれるOSS軍団である
OSSなのでもちろん無料で試せます

#### EdgeのサイドバーにいるAIチャットに聞いてみた

> efkログ基盤とは、Elasticsearch、Fluentd、Kibanaの3つのオープンソースソフトウェアを組み合わせたログ収集・分析基盤です。Elasticsearchはログデータの検索・分析を行うための検索エンジン、Fluentdはログデータを収集するためのデータ収集エージェント、Kibanaは収集したログデータを可視化するためのダッシュボードツールです。¹²¹: [Elasticsearch + Fluentd + Kibanaで作るログ基盤 - Qiita](https://qiita.com/tkngue/items/8b5f6e4c5b9a7a6e3a0f)
²: [EFK ログ基盤とは？ | さくらのナレッジ](https://knowledge.sakura.ad.jp/24196/)

ソース: Bing との会話 2023/6/11(1) Fluentd＋Elasticsearch＋Kibanaで作るログ基盤の概要と構築方法. https://atmarkit.itmedia.co.jp/ait/articles/1704/06/news013.html アクセス日時 2023/6/11.
(2) OpenShiftのEFKログ基盤 - 赤帽エンジニアブログ. https://rheb.hatenablog.com/entry/openshift-20181211 アクセス日時 2023/6/11.
(3) EFK(Elasticsearch,Fluentd,Kibana)で簡単ログ基盤をdocker .... https://qiita.com/foursue/items/9add0ec18efacb2fc2d2 アクセス日時 2023/6/11.


## Docker Composeで環境をつくる

Fluentd 1.0 の公式サイトに、[Docker Composeのサンプル](https://docs.fluentd.org/container-deployment/docker-compose)が載っている

手順に沿って、`docker-compose.yml`ファイルやコンフィグファイルを作成し、いざ`docker compose up`をすると**エラーが出る**（※2023年6月10日時点）

＜エラー内容＞

> /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in 'require': cannot load such file -- elasticsearch/transport/transport/connections/selector (LoadError)

同エラーを報告している[GithubのIssue](https://github.com/fluent/fluentd-docs-gitbook/issues/391)を参考に直す

依然として、webコンテナが立ち上がらない・・・

### 時間が解決するらしい

webコンテナを立ち上げようとしたときのエラー内容

＜web-1エラー内容＞

> Error response from daemon: failed to initialize logging driver: dial tcp [::1]:24224: connect: connection refused

まだローカルホストの24224ポートにアクセスできない

いろいろ調べてみたが、結局**1分ほど時間をおけば、立ち上がる**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/b7a490c0-dbfc-c3f3-40bc-b8d3b40734ec.png)

#### fluentdのエラー

立ち上がらない間のfluentdのエラー内容は以下の通り

＜fluentd-1エラー＞

> unexpected error error_class=Elastic::Transport::Transport::Error error="Connection refused - connect(2) for 172.25.0.2:9200 (Errno::ECONNREFUSED)"

`docker-compose.yml`に`depends on`をつけても解消しなかった

## Kibanaをセットアップする

http://localhost:5601/app/management/kibana/indexPatterns
にアクセスして、`fluentd-*`という名のdata viewをつくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/688b950a-d5f3-a523-9b22-fb938325e529.png)

## localhost:80にHTTPでアクセスしたときのログ

公式の手順書では`curl`を使うと書いてあるが
httpdイメージにはデフォルトで`curl`コマンドが入っていないので
ブラウザから`localhost:80`に10回ほどアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/c9da1c7f-fc29-bfbe-880d-93ca14a554ef.png)

ある時間にログが集中しており、HTTP-GETが連続しているログが残っている

## おわりに

Fluentd公式サイトにあるDocker Composeのサンプルを使って
HTTPアクセスのログをグラフィカルに見ることができた

これを応用して、syslogなど他のログも同様に可視化したい

## 参考

https://gmor-sys.com/2022/05/27/fluentd-docker-samples/

## 付録

### Dockerfile

バージョンは5.2.4を使った

```Dockerfile
# fluentd/Dockerfile

FROM fluent/fluentd:v1.12.0-debian-1.0
USER root
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "5.2.4"]
USER fluent
```

### docker-compose.yml

kibanaとelasticsearchのバージョンは8.1.2を使った
また、elasticsearchのenvironmentにセキュリティを甘くする１行を追加した

```yml
version: "3"
services:
  web:
    image: httpd
    ports:
      - "80:80"
    links:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: httpd.access

  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links:
      - "elasticsearch"
    ports:
      - "24224:24224"
      - "24224:24224/udp"

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.1.2
    container_name: elasticsearch
    environment:
      - "discovery.type=single-node"
      - xpack.security.enabled=false
    expose:
      - "9200"
    ports:
      - "9200:9200"

  kibana:
    image: docker.elastic.co/kibana/kibana:8.1.2
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"
```


## 糸冬了！！