Zabbixログ監視/SNMPトラップ監視データのKafkaへの転送

# 概要
以下の記事を参考に、Zabbixで取得したログ監視／SNMPトラップのデータをKafkaに転送する検証を実施した際の手順をまとめました。

https://qiita.com/ktaka1104/items/bd178a4eebfa7b07e40a

# 環境
基本的な環境構成は[参考記事](https://qiita.com/ktaka1104/items/bd178a4eebfa7b07e40a)の内容と同様ですが、
Zabbixでログ監視、SNMPトラップ監視を実施するため、以下の追加設定が必要となります。
- ログ監視
  Zabbixでログ監視を実施するために、監視対象ノードへZabbixエージェントをインストールする必要があります。
  またZabbixエージェント⇒Zabbixサーバへ通信を行うための通信許可設定が必要です。

- SNMPトラップ監視
  SNMPトラップの場合、SNMPポーリングとは逆にSNMPエージェントからZabbixサーバのUDP 162 Portへデータが送信されるため、サーバ側でデータを受信する仕組みが必要です。
  今回の構成では、ZabbixサーバをDockerコンテナで構築しているため、別途SNMPトラップを受信するためのコンテナを起動します。

![infra_config.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/664b9146-6fd1-93ea-b9b6-d5a669dcbbdd.jpeg)

# 手順
[参考記事](https://qiita.com/ktaka1104/items/bd178a4eebfa7b07e40a) 範囲内の構築作業は実施済みの想定で、
ログ監視／SNMPトラップ監視データ連携を行うための追加設定手順を記載していきます。

## ログ監視

### 1. Zabbixエージェント通信許可設定
Zabbixでログ監視を実施する場合、ZabbixエージェントからZabbixサーバへアクティブチェックと呼ばれる通信を行うため、
Zabbixサーバ側にZabbixエージェントからの通信許可設定をします。

まず```docker ps```コマンドでZabbixサーバ側の待受けポートを確認します。
```
CONTAINER ID   IMAGE                                             COMMAND                  CREATED          STATUS                    PORTS                                                                            NAMES
8b5ee7314b4b   zabbix/zabbix-server-mysql:ubuntu-7.0-latest      "/usr/bin/docker-ent…"   53 minutes ago   Up 53 minutes             0.0.0.0:10051->10051/tcp, :::10051->10051/tcp                                    zabbix-docker-zabbix-server-1
83e930d56a53   zabbix/zabbix-web-nginx-mysql:ubuntu-7.0-latest   "docker-entrypoint.sh"   53 minutes ago   Up 53 minutes (healthy)   0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp   zabbix-docker-zabbix-web-nginx-mysql-1
aaaaa896dcbe   mysql:8.0-oracle                                  "docker-entrypoint.s…"   53 minutes ago   Up 53 minutes                                                                                              zabbix-docker-mysql-server-1
```

確認したポートへの通信許可設定をZabbixノードのインバウンドルールに追加します。
![add_inbound_rule_tcp_10051.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/4add684b-ec06-2cb4-9f29-3cd5f565ba6c.jpeg)


### 2. Zabbixエージェントインストール
以下のサイトにアクセスし、今回Zabbixエージェントをインストールする環境に合わせた要件を選択します。

https://www.zabbix.com/download

![choose_zabbix_agent_platform.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/597f4e5a-726c-41e3-6dce-cc1fb215499f.jpeg)

表示された手順に基づいて、Zabbixエージェントをインストールします。
```
$ sudo wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-2+ubuntu24.04_all.deb
$ sudo dpkg -i zabbix-release_7.0-2+ubuntu24.04_all.deb
$ sudo apt update
$ sudo apt install zabbix-agent
```

インストールが完了したら、```/etc/zabbix/zabbix_agentd.conf```にログ監視を行うための設定をします。
```zabbix_agentd.conf 設定項目
# A list of comma-delimited IP addresses, optionally in CIDR notation, or DNS names of Zabbix servers and Zabbix proxies.
Server=<ZabbixノードのIPアドレス>

# The Zabbix server/proxy address or cluster configuration to get active checks from.
ServerActive=<ZabbixノードのIPアドレス>:<zabbix-serverコンテナの待受けポート番号>

# An optional parameter that defines the hostname.
Hostname=任意（Zabbixサーバ側で定義するhostの[Host name]と一致するよう設定する）
```

変更した設定を反映するため、```zabbix-agent```サービスを再起動します。
```
$ sudo systemctl restart zabbix-agent
```

### 3. Zabbix ログ監視設定
監視対象ノードへのZabbixエージェントのインストールが完了したら、ZabbixのWebUIへログインし、ログ監視設定を追加します。

はじめにログ監視用hostを追加します。
WebUI画面ログイン後、左ペインの```Data Collection``` > ```Hosts```を選択し、host一覧画面右上の```Create host```ボタンをクリックします。

host作成画面が表示されたら、以下のように設定し```Add```ボタンをクリックします。
![create_logmon_host.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/8ffaeb50-16b1-0c93-f108-e7e0faee9569.jpeg)
- Host name：任意（Zabbixエージェント側の[Hostname]設定と一致する値を設定する）
- Host groups：任意
- Interfaces：Type：Agent
- Interfaces：IP address：監視対象ノードのIPアドレス
- Interfaces：Port：10050

hostの作成が完了したら、ログ監視用itemを作成します。
作成hostの```items```をクリックしてitem一覧画面を開き、```Create item```ボタンをクリックします。

item作成画面が表示されたら、以下のように設定し```Add```ボタンをクリックします。
![create_logmon_item01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/8e86e3e7-031d-2d02-680d-4f489a5a577f.jpeg)
![create_logmon_item02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/f9fe83c1-4c9b-3347-b9b3-19e5a3524ac1.jpeg)
- Itemタブ	
  - Name：任意
  - Type：Zabbix agent (active)
  - Key：log[監視対象ログファイルパス]
  - Type of information：Log
- Tagsタブ	
  - Name/Value：任意（他itemと重複しないよう設定）

ログ監視用itemに設定したTagは、Kafkaへ連携するデータのフィルタリングに使用します。
Zabbix WebUI画面の左ペインから```Administration``` > ```General``` > ```Connectors```を選択し、表示されたConnector一覧からKafka連携用のConnectorをクリックします。
Connector設定画面が表示されたら、以下のように設定を追加し```Update```ボタンをクリックします。
![update_kafka_connector01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/8bd22e2d-ca5d-ffa4-c800-7fe319e3307b.jpeg)
- Tag filter
  - Tag：ログ監視用itemに設定したTagのName
  - operator：Equals
  - value：ログ監視用itemに設定したTagのValue

### 4.ログ監視データ転送確認
KafkaノードでKafka Brokerコンテナにログインし、ログ監視データが転送されていることを確認します。
```
$ docker exec -it kafka_broker-kafka-1 /bin/bash

$ /opt/bitnami/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic items
```

監視対象ノードでテスト用のログを出力します。
```
$ echo "`date '+%Y/%m/%d %H:%M:%S'` test log" > <監視対象ログファイルパス>
```

ログ監視設定、データ連携設定に問題がなければ、Kafka Brokerコンテナ側で以下のような監視データが転送されていることを確認できます。
```
{"clock":1724746102,"eventid":0,"groups":["test"],"host":{"host":"test_logmon_node","name":"test_logmon_node"},"item_tags":[{"tag":"test","value":"z2ktest_logMonitoring"}],"itemid":47302,"name":"logMonitoring","ns":359525138,"severity":0,"source":"","timestamp":0,"type":2,"value":"2024/08/27 08:07:25 test log"}
```

## SNMPトラップ監視
### 1. zabbix-snmptrapsコンテナ起動
zabbix-snmptrapsコンテナを起動するため、[参考記事](https://qiita.com/ktaka1104/items/bd178a4eebfa7b07e40a)内でZabbixコンテナ構築に利用したマニフェスト```docker-compose_v3_ubuntu_mysql_latest.yaml```を使用します。
ファイル内容を確認すると、zabbix-snmptrapsのサービス定義が記載されています。
```docker-compose_v3_ubuntu_mysql_latest.yaml 抜粋
～～～抜粋～～～
 zabbix-snmptraps:
  extends:
   file: compose_zabbix_components.yaml
   service: snmptraps
  image: "${ZABBIX_SNMPTRAPS_IMAGE}:${ZABBIX_UBUNTU_IMAGE_TAG}${ZABBIX_IMAGE_TAG_POSTFIX}"
  labels:
   com.zabbix.os: "${UBUNTU_OS_TAG}"
～～～抜粋～～～
```
```docker compose```コマンドの引数にサービス名を指定し、zabbix-snmptrapsコンテナを起動します。
```
$ docker compose -f ./docker-compose_v3_ubuntu_mysql_latest.yaml up -d zabbix-snmptraps
```
```docker compose ps```コマンドでzabbix-snmptrapsコンテナが起動していることを確認します。
```
NAME                                     IMAGE                                             COMMAND                  SERVICE                  CREATED          STATUS                 PORTS
zabbix-docker-mysql-server-1             mysql:8.0-oracle                                  "docker-entrypoint.s…"   mysql-server             2 hours ago      Up 2 hours
zabbix-docker-zabbix-server-1            zabbix/zabbix-server-mysql:ubuntu-7.0-latest      "/usr/bin/docker-ent…"   zabbix-server            2 hours ago      Up 2 hours             0.0.0.0:10051->10051/tcp, :::10051->10051/tcp
zabbix-docker-zabbix-snmptraps-1         zabbix/zabbix-snmptraps:ubuntu-7.0-latest         "/usr/sbin/snmptrapd…"   zabbix-snmptraps         15 seconds ago   Up 13 seconds          0.0.0.0:162->1162/udp, :::162->1162/udp
zabbix-docker-zabbix-web-nginx-mysql-1   zabbix/zabbix-web-nginx-mysql:ubuntu-7.0-latest   "docker-entrypoint.sh"   zabbix-web-nginx-mysql   2 hours ago      Up 2 hours (healthy)   0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp
```

### 2. SNMPトラップ通信許可設定
Zabbixサーバ側でUDP 162 Portへの通信を受け付けられるように、Zabbixノードのインバウンドルールに通信許可設定を追加します。
![add_inbound_rule_udp_162.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/5f8b7580-835b-f0ef-d360-0edd69dc0f73.jpeg)

### 3. SNMPトラップ監視設定
ZabbixのWebUIへログインし、SNMPトラップ監視設定を追加します。

WebUI画面ログイン後、左ペインの```Data Collection``` > ```Hosts```を選択し、表示されたhost一覧画面から[参考記事](https://qiita.com/ktaka1104/items/bd178a4eebfa7b07e40a) 内で作成したSNMP監視用hostの```items```をクリックします。

item一覧画面で```Create item```ボタンをクリックし、
item作成画面が表示されたら、以下のように設定し```Add```ボタンをクリックします。
![create_snmptrap_item01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/a6f5845e-9acb-2c2b-6070-26e2e02fa094.jpeg)
![create_snmptrap_item02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/ecaa1992-714f-a71b-b23d-04a40bc53824.jpeg)
- Itemタブ	
  - Name：任意
  - Type：SNMP trap
  - Key：snmptrap.fallback
  - Type of information：Log
- Tagsタブ	
  - Name/Value：任意（他itemと重複しないよう設定）

SNMPトラップ監視用itemの作成に成功したら、itemに設定したTagをKafka連携用ConnectorのTag filterに設定します。
Zabbix WebUI画面の左ペインから```Administration``` > ```General``` > ```Connectors```を選択し、表示されたConnector一覧からKafka連携用のConnectorをクリックします。
Connector設定画面が表示されたら、以下のように設定を追加し```Update```ボタンをクリックします。
![update_kafka_connector02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/124a3af7-5b5a-1906-dc6c-31d0962466de.jpeg)
- Tag filter
  - Tag：SNMPトラップ監視用itemに設定したTagのName
  - operator：Equals
  - value：ログ監視用itemに設定したTagのValue

### 4. SNMPトラップ監視データ連携確認
KafkaノードでKafka Brokerコンテナにログインし、SNMPトラップ監視データが連携されていることを確認します。
```
$ docker exec -it kafka_broker-kafka-1 /bin/bash

$ /opt/bitnami/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic items
```

監視対象ノードからテスト用のSNMPトラップを送信します。
```
$ sudo snmptrap -v2c -c <コミュニティ名> <ZabbixノードのIPアドレス> '' .1.3.6.1.4.1.311.1.1.3.1.2 .1.3.6.1.4.1.311.1.1.3.1.2 s "test trap"
```

SNMPトラップ監視設定、データ連携設定に問題がなければ、Kafka Brokerコンテナ側で以下のような監視データが転送されていることを確認できます。
```
{"clock":1724747610,"eventid":0,"groups":["test"],"host":{"host":"test_snmp_node","name":"test_snmp_node"},"item_tags":[{"tag":"test","value":"z2ktest_snmpTrap"}],"itemid":47303,"name":"snmpTrap","ns":872007152,"severity":0,"source":"","timestamp":0,"type":2,"value":"2024-08-27T08:33:29+0000 UDP: [34.214.124.230]:46416-\u003e[172.16.238.4]:1162\nDISMAN-EVENT-MIB::sysUpTimeInstance = 933161\nSNMPv2-MIB::snmpTrapOID.0 = SNMPv2-SMI::enterprises.311.1.1.3.1.2\nSNMPv2-SMI::enterprises.311.1.1.3.1.2 = \"test trap\""}
```

# 参考
https://qiita.com/ktaka1104/items/bd178a4eebfa7b07e40a
https://www.zabbix.com/download
https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/log_items
https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/snmptrap
https://hub.docker.com/r/zabbix/zabbix-snmptraps/
https://github.com/zabbix/zabbix-docker