Help us understand the problem. What is going on with this article?

ZabbixからAmazon SNSを使って通知を飛ばす

More than 1 year has passed since last update.

はじめに

Amazon Simple Notification Service(以下、SNSと記述します)は、とても柔軟で便利です。
Topicを設定し、サブスクリプション登録することで、Email通知、SMS通知、URLを叩いたり、SQSに投げたりと、柔軟に通知処理が構築できます。
今回は、ZabbixからSNSを呼べるように設定します。
なお、AWS側の詳しい手順は記載していませんので、ご了承ください。

Zabbix設定

ZabbixのWeb画面にて設定

  • 管理 > メディアタイプ > メディアタイプの作成
項目名 設定値
名前 SNS-Alert
タイプ スクリプト
スクリプト名 sns_send.sh
スクリプトパラメータ {ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
  • 設定 > ユーザー  > (ユーザを選択) > メディア > 追加
項目名 設定値
タイプ SNS-Alert
送信先 arn:aws:sns:ap-northeast-1:xxxxxxx:myTopic
有効な時間帯 お好みで
指定した深刻度のときに使用 お好みで

ここで指定した送信先は、{ALERT.SENDTO}に渡るようです。

シェルスクリプトの配置

zabbixユーザーで、awsコマンドを使えるようにしておきます。
インストール手順は、AWSのサイトを参考にしてください。
IAMは、SNS publish権限が必要です。

以下のシェルは、後述するサイトを参考にさせていただきました。

/usr/lib/zabbix/alertscripts/sns_send.sh
#!/bin/sh

TOPIC_ARN=$1
SUBJECT=$2
MESSAGE=$3

echo "`date` $TOPIC_ARN $SUBJECT" >> /tmp/zabbix-sns.log

if [ "$SUBJECT" = "" -o "$TOPIC_ARN" = "" ]; then
  echo "usage: $0 {ARN SUBJECT MESSAGE}"
  exit 1
fi

if [ "$MESSAGE" = "" ]; then
  MESSAGE=$SUBJECT
fi

aws sns publish --topic-arn $TOPIC_ARN --subject "$SUBJECT" --message "$MESSAGE"

シェルを作成したら、シェルの実行権限付与をお忘れなく。
AWS側の手順は割愛しますが、AWS側でサブスクリプション登録をしてから、試しにシェルを実行してみます。

./sns_send.sh arn:aws:sns:ap-northeast-1:xxxxxxx:myTopic test-subject test-message
{
    "MessageId": "xxxxxxx-xxxx-xxx-xxx-xxxxxxxxxxxxx"
}

これで通知が飛べばOKです。
快適な通知ライフを!

注意事項

実際に設定してみたのですが、うまく動かず調べました。
いくつか注意点を載せておきますので、参考にしてください。

スクリプトの配置場所について

zabbix_server.confで設定しているAlertScriptsPathのパスに、シェルを配置しているかどうか確認してください。
Zabbixのスクリプト名に、sns_send.shと設定していますが、絶対パスではNGのようです。

/usr/local/etc/zabbix_server.conf
User=zabbix
SSLKeyLocation=/usr/local/share/zabbix/ssl/keys
SSLCertLocation=/usr/local/share/zabbix/ssl/certs
PidFile=/tmp/zabbix_server.pid
LogType=console
LoadModulePath=/usr/lib/zabbix/modules
ExternalScripts=/usr/local/share/zabbix/externalscripts
DBUser=zabbix
DBPort=3306
DBPassword=my_password
DBName=zabbix
DBHost=zabbix.db
AlertScriptsPath=/usr/local/share/zabbix/alertscripts

上記の場合は、
誤) /usr/lib/zabbix/alertscripts/sns_send.sh
正) /usr/local/share/zabbix/alertscripts/sns_send.sh
となります。

awsコマンドが失敗する

プロキシ配下で動かす場合や、認証情報がうまく取れていない場合、シェルに工夫が必要です。

# 必要な変数の設定
export HTTP_PROXY=http://xxx.xxx.xxx.xx:yyyy
export HTTPS_PROXY=http://xxx.xxx.xxx.xx:yyyy
export AWS_SHARED_CREDENTIALS_FILE=/home/zabbix/.aws/credentials
export AWS_CONFIG_FILE=/home/zabbix/.aws/config

# 認証情報のチェック
/home/zabbix/.local/bin/aws configure list >> /tmp/zabbix-sns.log

# sns publish
/home/zabbix/.local/bin/aws sns publish --topic-arn $TOPIC_ARN --subject "$SUBJECT" --message "$MESSAGE"

# exit status
echo "`echo $?`" >> /tmp/zabbix-sns.log

参考記事

zabbixのメディアタイプをスクリプトにしてAWSのSNSを使う
https://hacknote.jp/archives/6587/

akikinyan
職業はSEです。最近はAWSを使った案件対応をやっています。
https://github.com/akikinyan
mohikanz
エンジニアのための雑談コミュニティ
https://mohikanz.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away