Amazon Linux 2023でZabbixのSNMP Trap受信を設定する手順まとめ


Amazon Linux 2023 上で Zabbix に SNMP Trap を受信させるための設定手順をまとめました。
Zabbix の SNMP Trap 機能を使ってネットワーク機器などからの通知を受け取りたい方に向けた内容です。


- 検証環境: Amazon Linux 2023, Zabbix 7.0
- 対象読者: Zabbix の SNMP Trap を試してみたい方、構築手順を自動化したい方


## OS側の設定

### 必要なパッケージのイントールする。

```console
sudo dnf -y install net-snmp net-snmp-utils net-snmp-perl
```

### snmptrapsの情報を保存するためのディレクトリを作成する。

```console
sudo mkdir -p /var/log/zabbix/snmptraps
sudo touch /var/log/zabbix/snmptraps/snmptraps.log
sudo chown -R zabbix:zabbix /var/log/zabbix/snmptraps
sudo chmod 666 /var/log/zabbix/snmptraps/snmptraps.log

```



## Zabbixの設定変更

### zabbix_server.confの編集

`/etc/zabbix/zabbix_server.conf`以下箇所の設定値を変更する。

```diff

### Option: LogFile
#       Log file name for LogType 'file' parameter.
#
# Mandatory: yes, if LogType is set to file, otherwise no
# Default:
# LogFile=
+ LogFile=/var/log/zabbix/zabbix_server.log

### Option: SNMPTrapperFile
#       Temporary file used for passing data from SNMP trap daemon to the server.
#       Must be the same as in zabbix_trap_receiver.pl or SNMPTT configuration file.
#
# Mandatory: no
# Default:
# SNMPTrapperFile=/tmp/zabbix_traps.tmp
+ SNMPTrapperFile=/var/log/zabbix/snmptraps/snmptraps.log


### Option: StartSNMPTrapper
#       If 1, SNMP trapper process is started.
#
# Mandatory: no
# Range: 0-1
# Default:
+ StartSNMPTrapper=1

```

## SNMP trapのハンドラスクリプトを作成する

`/usr/sbin/zabbix_trap_handler.sh`にハンドラスクリプトを配置する。

```bash
#!/bin/bash
LOGFILE="/var/log/zabbix/snmptraps/snmptraps.log"
while read line; do
  echo "$line" >> "$LOGFILE"
done
```

## snmptrapdの設定

`/etc/snmp/snmptrapd.conf`を編集する。

```diff
+authCommunity log,execute,net public 
+traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
```

## サービスの再起動

```console
sudo systemctl enable snmptrapd
sudo systemctl restart snmptrapd
sudo systemctl restart zabbix-server
```

### おまけ：まとめて設定した場合のシェルスクリプト

設定値は用途に合わせて要編集

```bash
#!/bin/bash

# Exit on error
set -e

# 色の定義
GREEN=$(tput setaf 2)
BLUE=$(tput setaf 4)
YELLOW=$(tput setaf 3)
RED=$(tput setaf 1)
RESET=$(tput sgr0)

log_info() {
  echo -e "${BLUE}[INFO]${RESET} $1"
}

log_ok() {
  echo -e "${GREEN}[OK]${RESET} $1"
}

log_warn() {
  echo -e "${YELLOW}[WARN]${RESET} $1"
}

log_error() {
  echo -e "${RED}[ERROR]${RESET} $1"
}

# 変数定義
CONFIG_FILE="/etc/zabbix/zabbix_server.conf"
TRAP_LOG_DIR="/var/log/zabbix/snmptraps"
TRAP_LOG_FILE="$TRAP_LOG_DIR/snmptraps.log"
TRAP_HANDLER="/usr/sbin/zabbix_trap_handler.sh"
SNMPTRAPD_CONF="/etc/snmp/snmptrapd.conf"
BACKUP_FILE="${CONFIG_FILE}.bak.$(date +%Y%m%d%H%M%S)"

log_info "Installing required packages..."
if sudo dnf install -y net-snmp net-snmp-utils net-snmp-perl; then
  log_ok "Packages installed successfully."
else
  log_error "Failed to install required packages."
  exit 1
fi

log_info "Creating SNMP trap log directory and file..."
if sudo mkdir -p "$TRAP_LOG_DIR" && sudo touch "$TRAP_LOG_FILE"; then
  sudo chown -R zabbix:zabbix "$TRAP_LOG_DIR"
  sudo chmod 666 "$TRAP_LOG_FILE"
  log_ok "SNMP trap log directory and file created."
else
  log_error "Failed to create SNMP trap log directory or file."
  exit 1
fi

log_info "Backing up Zabbix server configuration to $BACKUP_FILE"
if sudo cp "$CONFIG_FILE" "$BACKUP_FILE"; then
  log_ok "Backup created successfully."
else
  log_error "Failed to create backup."
  exit 1
fi

declare -A settings=(
  ["StartSNMPTrapper"]="1"
  ["SNMPTrapperFile"]="$TRAP_LOG_FILE"
)

log_info "Updating Zabbix server configuration..."
for key in "${!settings[@]}"; do
  value="${settings[$key]}"
  if grep -qE "^${key}=${value}$" "$CONFIG_FILE"; then
    log_ok "Skipped (already correct): $key=$value"
  elif grep -Eq "^[#]*\s*${key}=" "$CONFIG_FILE"; then
    sudo sed -i "s|^[#]*\s*${key}=.*|${key}=${value}|" "$CONFIG_FILE"
    log_ok "Updated: $key=$value"
  else
    echo "${key}=${value}" | sudo tee -a "$CONFIG_FILE" > /dev/null
    log_ok "Added: $key=$value"
  fi
done

log_info "Creating SNMP trap handler script..."
sudo tee "$TRAP_HANDLER" > /dev/null << 'EOF'
#!/bin/bash
LOGFILE="/var/log/zabbix/snmptraps/snmptraps.log"
while read line; do
  echo "$line" >> "$LOGFILE"
done
EOF

sudo chmod +x "$TRAP_HANDLER"
log_ok "SNMP trap handler script created."

log_info "Configuring snmptrapd..."
if grep -q "traphandle default /bin/bash $TRAP_HANDLER" "$SNMPTRAPD_CONF" && \
   grep -q "authCommunity log,execute,net public" "$SNMPTRAPD_CONF"; then
  log_ok "Skipped: snmptrapd.conf already configured."
else
  sudo tee "$SNMPTRAPD_CONF" > /dev/null << EOF
authCommunity log,execute,net public
traphandle default /bin/bash $TRAP_HANDLER
EOF
  log_ok "Configured: snmptrapd.conf updated."
fi

log_info "Enabling and restarting services..."
sudo systemctl enable snmptrapd
sudo systemctl restart snmptrapd
sudo systemctl restart zabbix-server
log_ok "Services enabled and restarted."

log_ok "SNMP trap reception setup completed successfully."

```


参考URL

https://www.zabbix.com/documentation/7.0/en/manual/config/items/itemtypes/snmptrap