SendgridのバウンスリストをZabbixで監視する
こんにちは、インフラ担当です。
ニッチな技術ブログになりますが、ご容赦ください。
当社ではフォームメールや業務システムからのメールを送信する際、SendgridというSaaSを利用しています。
Sendgridには、バウンスリストという機能があります。
公式情報によると、
バウンスイベントは、送信したメールが受信側のメールサーバに拒絶された場合に発生します。よくある原因としては、メールアドレスのスペルミス、存在しないメールアドレス、宛先のメールボックスが一杯になっているなどです。
バウンスが発生した宛先のリストは、SUPPRESSIONS > Bounces で確認でき、このリストを「バウンスリスト」と呼びます。
バウンスリストに載っている宛先には再度メールを送信しようとしても、SendGridはそれを拒否します。
これは、不正な宛先であることが確認されているためです。
となっています。
この機能は無駄なメール送信を減らすのに有効ですが、社内メールアドレスの誤削除や、メールサーバの障害発生時にアドレスがバウンスリストに入ると、管理画面からリストを見る以外に確認する方法がなくて意外と困ることがあります。
※もちろん、使用中のアドレスを削除しない、障害を前提にしないことは大切ですが。。
そこで、社内アドレス(@speedia.co.jp)がバウンスリストに入った際に、監視サーバのZabbixで検知させる方法を紹介します。
ステップ1: APIキーの作成
Sendgrid ⇒ 設定 ⇒ APIキー ⇒ Create API keyから作成
アクセスはSuppressionsのRead Accessのみとします。
ステップ2: ZABBIXの設定確認
ZABBIXにCLIでログインし、外部スクリプトが有効になっていることを確認します。
# grep externalscripts /etc/zabbix/zabbix_server.conf ExternalScripts=/usr/lib/zabbix/externalscripts
ステップ3: スクリプト作成
以下の内容でスクリプトを作成します。
#!/bin/bash
# Zabbixマクロで指定されたAPIキーを受け取る
API_KEY="$1"
# 現在時刻と1時間前の時刻を取得
CURRENT_TIME=$(date +%s) ONE_HOUR_AGO=$((CURRENT_TIME - 3600))
# SendGrid APIのエンドポイント
URL="https://api.sendgrid.com/v3/suppression/bounces?start_time=${ONE_HOUR_AGO}&end_time=${CURRENT_TIME}"
# APIリクエストを実行
response=$(curl -s -H "Authorization: Bearer $API_KEY" "$URL")
# エラーハンドリング
if [[ $? -ne 0 ]]; then
echo "ERROR: SendGrid APIへの接続に失敗しました。"
exit 1
fi
# レスポンスの解析とバウンスメールアドレスの抽出
echo "$response" | jq -r '.[].email' | tr '\n' ','
ステップ4: ZABBIXのホスト作成
ZABBIX管理画面で適当なホストを作成し、マクロにAPIキーを入力します。
ステップ5: アイテム作成
名前: sendgrid.api.supression.bounces.data
タイプ: 外部チェック
キー: get_sendgridbounce.sh[{$BOUNCELIST_KEY}]
データ型: テキスト
監視間隔: 60m
ステップ6: トリガー設定
今回は「speedia.co.jp」のアドレスが入ったときに引っ掛けたいので、トリガー条件式は以下のようになります。
find(/sendgrid_error_check/get_sendgridbounce.sh[{$BOUNCELIST_KEY}],,"regexp","speedia.co.jp")=1
ステップ7: テスト
存在しないアドレスに対してSendgridからメールを送信し、バウンスリストに登録されることを確認します。
ZABBIX側でも正常に検知できました。
今回の記事は以上となりますが、ZABBIXは有効に活用することで業務のエラーチェック等にも役立てられるので、単にサーバ障害の検知だけでなく、さまざまな使い道を模索するのも楽しそうです。