はじめに
こんにちは、酸素です。
弊社では様々なお客様向けに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番ポートにブラウザでアクセスすると、最初は下記のような画面となります。

「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 |

最後に
今回は各時刻のアクセス数のグラフのみ作成してみました。
また、MMDBなどで接続元IPアドレスから国籍を分類し、国別のアクセス統計やパスの分析もできるようでした。
なお、ログのサイズによってはメモリ消費量が肥大化する場合があるので(1敗)、設定のチューニングは細かくしていくべきだと思いました。

