はじめに
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権限が必要です。
以下のシェルは、後述するサイトを参考にさせていただきました。
#!/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のようです。
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/