fluentd + OpenSearchを使ってApacheのログを視覚化する

酸素
2026-08-13
2026-08-13

はじめに

こんにちは、酸素です。

弊社では様々なお客様向けにwebサーバーをご提供しておりますが、アクセスログの調査をご依頼いただくことが多々あります。
ご依頼によっては、「どの国からのアクセスが多いか」、「1カ月前と比べてどれくらいアクセスが増えたか」といったご質問もいただきますが、サーバーに保存している生のログファイルでは、パイプを駆使したコマンドを実行する必要があります。
返答までの時間の削減やノウハウの継承を考えると、手順の簡略化は課題として上がると思います。

そこで今回は、fluentd と OpensearchというOSSを用いてログをグラフ化し、アクセスの傾向を調べてみようと思います。

利用するミドルウェアについて

fluentdとは

fluentdの公式ページには以下のようなことが書かれています。

 Fluentd is an open-source data collector for a unified logging layer. Fluentd allows you to unify data collection and consumption for better use and understanding of data. 


(Fluentdは、統合ログレイヤーのためのオープンソースのデータ収集ツールです。Fluentdを使用することで、データ収集とデータ利用を統合し、データのより効果的な活用と理解を実現できます。 )

注意するべき点としては、fluentd単体ではログの可視化までは行うことができません。
あくまでログの収集および整形を行うアプリケーションです。

今回はApacheのアクセスログをfluentdに読み込ませ、後述のOpenSearchが解釈できるフォーマットに整形します。

OpenSearchとは

OpenSearchは全文検索エンジンとしてリリースされています。元々はElasticSearchというエンジンが主に利用されていたものの、開発元からライセンスの変更があり利用に制限が生まれるようになったそうです。
そこで、ベンダーロックインを防ぐために、AWSが主体となってOpenSearchがOSSプロジェクトとして開発・公開されたようです。
参考サイト(AWS OpenSearchとは何ですか?)

なお、今回は全文検索エンジンの機能のほかに、ログのグラフ化のために「OpenSearch Dashboard」を利用します。

インストール

インストール環境

# cat /etc/os-release 
NAME="AlmaLinux"
VERSION="9.8 (Olive Jaguar)"

Fluentdのインストール・設定

// インストール
# curl -fsSL  https://fluentd.cdn.cncf.io/sh/install-redhat-fluent-package6-lts.sh  | sh

// バージョンの確認
# rpm -q fluent-package
fluent-package-6.0.4-2.el9.x86_64

# /opt/fluent/bin/fluentd --version
fluentd 1.19.3

// configファイルの確認
# ls -l /etc/fluent/fluentd.conf
-rw-r--r--. 1 root root 2386  7月 13 14:45 /etc/fluent/fluentd.conf

fluentdがOpenSearchに接続するために、configファイルを編集します。
構成としては以下のようになっています

パラメータ名
ログディレクトリ /opt/apache-log-analysis/logs/
ログの形式 access_ssl_log.processed.XX

 

# cat /etc/fluent/fluentd.conf
<system>
  log_level info
</system>

<source>
  @type tail
  @id input_apache_access

  path /opt/apache-log-analysis/logs/access_ssl_log.processed.*
  exclude_path ["/opt/apache-log-analysis/logs/*.gz"]

  pos_file /opt/apache-log-analysis/pos/apache.pos

  tag apache.access

  read_from_head true
  refresh_interval 5
  rotate_wait 5
  follow_inodes true

  <parse>
    @type apache2
  </parse>
</source>

<match apache.access>
  @type opensearch
  @id output_opensearch

  host 127.0.0.1
  port 9200
  scheme https

  user admin
  password hogehoge

  ssl_verify false

  logstash_format true
  logstash_prefix apache

  include_tag_key true
  tag_key fluent_tag

  <buffer>
    @type file
    path /opt/apache-log-analysis/buffer/opensearch

    flush_interval 5s
    retry_forever true
  </buffer>
</match>

configにて定義したディレクトリを作成・権限を調整し、プロセスを再起動させます

# mkdir /opt/apache-log-analysis/{buffer,logs,pos}
# chown -R root:root /opt/apache-log-analysis/logs
# chmod 755 /opt/apache-log-analysis/logs

# chown fluentd: /opt/apache-log-analysis/pos
# chown fluentd: /opt/apache-log-analysis/buffer

# chmod 750 /opt/apache-log-analysis/pos/
# chmod 750 /opt/apache-log-analysis/buffer/

# ls -ld /opt/apache-log-analysis/
drwxr-xr-x. 5 root root 43  8月  6 20:13 /opt/apache-log-analysis/

# ll /opt/apache-log-analysis/
合計 4
drwxr-x---. 2 root    root       6  8月  6 20:13 buffer
drwxr-xr-x. 2 root    root    4096  8月  6 20:13 logs
drwxr-x---. 2 fluentd fluentd    6  8月  6 20:13 pos

# systemctl restart fluentd

以上の設定で、指定したログファイルをスキャンしていきます。
なお、<parse>でapacheのログ形式をしているため、ログの各行をより細かいフィールド単位で分解していきます。

  <parse>
    @type apache2
  </parse>

 

 

OpenSearchのインストール・設定

OpenSearch側もインストールとfluentdからデータを受け取るための設定を行っていきます。

# curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/3.x/opensearch-3.x.repo -o /etc/yum.repos.d/opensearch.repo

# curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/3.x/opensearch-dashboards-3.x.repo -o /etc/yum.repos.d/opensearch-dashboards-3.x.repo

# dnf install -y opensearch
# dnf install -y opensearch-dashboards

Linuxカーネルの変数「vm.max_map_count」も変更します。
この値を増やすことによって、プロセス1つあたりがメモリマップ(ファイルのインデックス)も増えます。

# echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-opensearch.conf
vm.max_map_count=262144

OpenSearch本体の設定を変更します。
ファイル自体の行数が長いため、変更点のみ記載します。

# diff /etc/opensearch/opensearch.yml /etc/opensearch/opensearch.yml.bk 
17c17
< cluster.name: apache-log-cluster
---
> #cluster.name: my-application
23c23
< node.name: node-1
---
> #node.name: node-1
55c55
< network.host: 127.0.0.1
---
> #network.host: 192.168.0.1
59c59
< http.port: 9200
---
> #http.port: 9200
68d67
< discovery.type: single-node

また、OpenSearch Dashboardsの設定も変更します。

# cat /etc/opensearch-dashboards/opensearch_dashboards.yml
server.host: "0.0.0.0"
server.port: 5601

opensearch.hosts: ["https://127.0.0.1:9200"]

opensearch.username: "admin"
opensearch.password: "hogehoge"

opensearch.ssl.verificationMode: none

プロセスを再起動、ファイアウォールでダッシュボード用のポートへの許可を行います。

# systemctl restart opensearch-dashboards

# firewall-cmd --permanent --add-port=5601/tcp
# firewall-cmd --reload

OpenSearch Dashboardsを触ってみる

OpenSearchを動かしているサーバーの5601番ポートにブラウザでアクセスすると、最初は下記のような画面となります。

1

「Add your data」で任意のデータをOpenSearch Dashboardsに取り込めますが、今回は既にfluentdからOpneSearchに取り込めているのでスキップします。

ハンバーガーマーク(横三本線のアイコン) > Visualize > Create visualization に進みます

次に、グラフの形式が選べるので、Line > apache-* を選択します

Metrics,Bucketsを以下のように入力し、開始~終了時刻を選択すればグラフが表示されます

  パラメータ名
Metrics Aggregation Count
Buckets Aggregation Data Histogram
Buckets Field @timestamp
Buckets Minimum interval Auto

5

 

最後に

今回は各時刻のアクセス数のグラフのみ作成してみました。
また、MMDBなどで接続元IPアドレスから国籍を分類し、国別のアクセス統計やパスの分析もできるようでした。

なお、ログのサイズによってはメモリ消費量が肥大化する場合があるので(1敗)、設定のチューニングは細かくしていくべきだと思いました。