プロキシ経由でZabbixのメール通知をしてみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。
くコ:彡がトレードマークの阿部です。

プロキシ経由でZabbix Serverのメール通知をしてみました。
メール通知には、AWS CLIのsend-emailコマンドを使います。

検証環境

構成図2

  • Proxyサーバ
    • AmazonLinux 2016.03
    • Squid 3.1.23
  • Zabbixサーバ
    • Red Hat Enterprise Linux Server release 7.2
    • GNU bash 4.2.46(1)-release
    • Zabbix Server 3.0.1
    • aws-cli 1.10.20

AMCからの作業

SESでのメールアドレスの検証

AWSマネージメントコンソール(以下、AMC)のSES画面にアクセスし、メールアドレスの検証を行います。
通知に使用するToアドレスとFromアドレスを検証して、それを所有する事を示します。
こちらに記載の「Eメールアドレスの検証」をオレゴンリージョンで実施して下さい。

サンドボックスの外への移動

デフォルトではSESはサンドボックス環境に配置され、制限を受けます。
特にZabbixの場合、送信メッセージは24時間あたり200通までという制限にかかりやすいかと思います。
SESを本番利用する場合、AWSに申請を行い外へ移動しましょう。
なお、サンドボックス外に移動した場合、Toアドレスの検証は不要になります。Fromアドレスの検証は引き続き必要です。
移動の手順と制限の詳細は、こちらを参照ください。

SES通知スクリプト

前提条件

aws --versionコマンドを実行し、AWS CLIが利用可能な事を確認します。
インストールされていない場合、こちらを参照しインストールして下さい。
IAMでsend-emailを実行する権限を与えてください。スクリプトはIAM Roleを使う事を前提にしています。

コード

Zabbix GUIから設定する内容が、スクリプトの引数になります。
プロキシ設定については、こちらを参照し適宜変更下さい。
スクリプトは、zabbix_server.conf中のAlertScriptsPathで指定されたパスに配置します。
検証環境では/usr/lib/zabbix/alertscripts/ses-sendemail.shとして保存し、パーミッションは-rwxr-xr-x root rootとしました。

#!/bin/bash

# AWSリージョン(オレゴン)
region='us-west-2'

# HTTPプロキシ
export HTTP_PROXY='http://ProxyServer-PrivateIPAddress:8080'
export HTTPS_PROXY='http://ProxyServer-PrivateIPAddress:8080'
export NO_PROXY=169.254.169.254

# Toメールアドレス
to=$1

# メール件名
subject=$2

# メール本文
text=$3

# Fromメールアドレス
from=$4

# メール送信
aws ses send-email --from "$from" --to $to --subject "$subject" --text "$text" --region $region

Zabbix Server

Zabbix ServerのGUIから行う設定を整理します。

メディアタイプ

管理 -> メディアタイプ から、スクリプトを登録します。
スクリプトパタメータに登録した内容が、スクリプトの引数になります。
スクリプトパラメータの4つ目には、Fromメールアドレスを指定します。

メディアタイプ

メディアタイプ -> スクリプトパラメータ 値を定義するメニュー スクリプトの引数
{ALERT.SENDTO} ユーザ -> メディア $1
{ALERT.SUBJECT} アクション -> デフォルトの件名 $2
{ALERT.MESSAGE} アクション -> デフォルトのメッセージ $3
Fromメールアドレス(≠マクロ) - $4

ユーザ

管理 -> ユーザ -> ユーザ名を選択 -> メディア から、先ほど追加したメディアを選択します。
送信先にToメールアドレスを入力します。入力した値は、メディアタイプの{ALERT.SENDTO}として参照されます。

ユーザ-メディア

アクション

設定 -> アクション -> イベントソース -> トリガー -> アクションの作成を選択します。
アクションの名前を入力します。その他はデフォルト値とします。
画面中のデフォルトの件名が{ALERT.SUBJECT}として、参照されます。また、デフォルトのメッセージは{ALERT.MESSAGE}として、参照されます。

アクション-アクション

アクションの実行条件は、デフォルト値としました。
アクションの実行内容では、送信するユーザグループ(またはユーザ)、メディアを指定します。

アクション

実行結果

メール

Zabbixエージェントを停止(systemctl stop zabbix-agent)すると、メール通知が行われました。

メール

プロキシログ

プロキシサーバの/var/log/squid/access.logには以下のログが残っていました。
SESのAPI(HTTPS)エンドポイントに、TCP :443ポートで接続された事がわかります。

1460538528.030    571 ZabbixServer-PrivateIP TCP_MISS/200 3320 CONNECT email.us-west-2.amazonaws.com:443 - DIRECT/54.***.**.** -

参考

以下のページを参考にさせて頂きました。

おわりに

ZabbixとAWS CLIのses send-emailコマンドを利用し、プロキシ経由でメール通知を行いました。
Zabbix以外でもses send-emailコマンドが活きるシーンがあると思いますので、頭の片隅に置いて頂けると嬉しいです。
くコ:彡