2020/09/03 ZabbixからSlackにアラート(Incoming Webhooks)
Zabbix
ZabbixとはOSSである統合監視ソフトウェア
サーバやネットワーク機器などを監視できる。
サーバやネットワーク機器を監視する中で、監視してどうするかが重要。
まず行う設定としては、障害発生時に管理者にメールが届くようにする。
ただメールよりも手軽に確認出来る仕組みがあればより良い。
今回は、Slack, Discordに対して通知する設定について学ぶ。
Webhook
Slack, Discord共に、Webhookという仕組みがある。
Webhookという点で仕組みは同じだが、細かいパラメータの違いはある。
そもそもWebhookとはなんなのか。
WebhookとはAPIのようなもので、
何かをトリガーにして、指定したURLに対してPOSTリクエストをしてくれるやつ。
APIと異なる点としては、自分からサーバになんらかの要求をすること無く、
サーバー側がトリガーを検知すると動作してくれる。
そんなWebhookをZabbixで利用すると、
障害発生をトリガーにして、Slackに対してPOSTリクエストをしてくれる。
当然、Slack側でPOSTリクエストを受け取ったらチャネルに投稿する処理が必要になるが、
それはSlack側で用意されている。Discordも同様。
Zabbix内でWebhookの設定する
Zabbix4.4からはWebhookを管理GUI内で設定できるようになった。
以前はスクリプトを書く必要があったらしい。
まず、Zabbixにアクセスし、
管理内のメディアタイプを選択。
https://gyazo.com/da77089a2840d9a2a5aa63c3e72425a0
右上のメディアタイプの作成を選択
タイプをWebhookに変更する。
https://gyazo.com/80bd7b65fb238acb41c6a0fd8a0af273
Zabbixでは
Message:{ALERT.MESSAGE}
To:{ALERT.SENDTO}
Subject{ALERT.SUBJECT}
の3つのアラートスクリプトパラメータが用意されている。
これをSlackの仕様に合わせるため、パラメータを変更する。
Toは利用しない。
Slackはキー'text'の内容が通知されるので、
textに内容を含める。
下のスクリプト設定にて、実際に送信時の処理を書く
Zabbixのドキュメントからコピーしてきたもの。
code:JavaScript
var req = new CurlHttpRequest();
req.AddHeader('Content-Type: application/x-www-form-urlencoded');
Zabbix.Log(4, 'webhook request value='+value);
'payload='+value
);
Zabbix.Log(4, 'response code: '+req.Status());
return JSON.stringify({
'tags': {
'endpoint': 'slack'
}
https://gyazo.com/cf080bae223555e4baa82c6f65c53cd5
おそらく、ここで設定したものがvalueになっている。
しかし、このままでは、ただメッセージが送られるだけでわかりにくいので、
解決時と障害発生時でSlack上での見た目を変更する。
解決時と障害発生時で{ALERT.SUBJECT}の中身が違う。
この中身はなんなのかということで、Zabbixのアクションを確認すると、
https://gyazo.com/c39c77a7a61c3e2a2022833feaffbe85
https://gyazo.com/d66ca3fe93e88463a90044df66cc0c77
https://gyazo.com/4283a78afc4beabf2385eb42c95e94a2
https://gyazo.com/e77b23b035ab0f86c36b529b6be85d17
このようになっていた。
おそらく、デフォルトの件名が{ALERT.SUBJECT}に該当するような気がする。
そこで、このデフォルトの件名によって色を分けることができる。
そこで、スクリプトを編集する。
このサイトを参考にしました。(ほぼコピー)
h ttp://nemunemu-zzz.hateblo.jp/entry/2019/11/27/010506
まず、Zabbixでこのようにパラメータを設定
https://gyazo.com/c33e3c99a64c72d31d1dc5a401a27590
{ALERT.SUBJECT}
{ALERT.MESSAGE}
はそれぞれ、
params.subject
params.textで取得できる。
スクリプトはJavaScriptで書く。
内容を追っていく。
attachmentsという配列を作る。
GUIで設定したパラメータvalueをJSONでパースする。
パースした、params.subjetをindexOfで一致するか確認する。
一致しない場合は-1を返すため、0になると一致と判断する。
一致した場合、その配列にJSON形式で値を格納する。
この値では、Slackのブロックの色や、見出しテキストが格納されている。
配列をpayload.attachmentsに格納する。
payloadをJSONにエンコードしたものをPOSTする。
POSTするURLはSlackで発行したものを入れる。
code:JavaScript
params = JSON.parse(value)
var req = new CurlHttpRequest();
req.AddHeader('Content-Type: application/x-www-form-urlencoded');
Zabbix.Log(4, 'webhook request value='+value);
attachments = []
if (params.subject.indexOf("Resolved:") === 0) {
} else if(params.subject.indexOf("Update") {
} else {
}
payload={}
payload.text = ""
payload.blocks = []
payload.attachments = attachments
req.Post(
'payload='+JSON.stringify(payload)
);
Zabbix.Log(4, 'response code: '+req.Status());
return JSON.stringify({
'tags': {
'endpoint': 'slack'
}
});
SlackのBlock Kit Builderで色々試せます。
https://gyazo.com/67f1fe4099d94da9b147c27ba07bf352
SlackでIncoming Webhookを追加
まずはSlackを開く。
Slackのワークスペースの設定メニューから
アプリを管理するを選択。
https://gyazo.com/a76a5d8c21363c138d374e20d301ccdc
カスタムインテグレーションを選択し、上の検索バーからWebhookを検索
https://gyazo.com/116b23046c85a9745ef5d36154ff4797
追加する。
https://gyazo.com/19b25dab80ae82cbe5e7dcc22953a9f2
投稿するチャンネルを選び、追加する。
説明を読む。
https://gyazo.com/a15550499e5a2b3bfb04a083734efb33
この内容は上のJavaScriptで行っている。
下の方に行くと、WebhookURLが確認できる。
これをZabbix内のコードで指定する。
アイコンと名前のカスタマイズもここで行う。
以上で設定を保存する。
実際に通知させるための設定
ここまでで、Webhookを利用するための設定は完了した。
メディアタイプからテストを試してみる。
https://gyazo.com/727aabc9ac5e2cf87c1965c9244eba6f
するとこのように表示される。
https://gyazo.com/e751987d46374ec8b92eef1d0c854c23
本番ではAlert.messageに値が格納される。
実際に障害を通知させるための設定はメールと同様。
Zabbix上の管理→ユーザを開き、有効なユーザを選択する。
メディアタブがあるのでクリック。
追加を押し、タイプから先程作成したWebhookを選んであげる。
時間帯や、どのレベルの通知を行うかも設定できる。
Statusを有効にするのも忘れずに。
https://gyazo.com/f2b618c048aa3804c92774a98b6bb1ae
更新。
以上で設定が完了。
無事に送られてくるか、障害を起こしてテストする。
マイルームの気温を見るWebページを監視するトリガーを作ったので、
そこから帰ってくるレスポンスコードが200かどうかを監視する。
試しにWebサーバ側でファイル名を変更し、404を起こしてみる。
また、障害発生後にもとに戻し、復旧も試す。
https://gyazo.com/8296c7fe5f4acfbfdae378f8e28b4d4c
無事にわかりやすく表示された。
Slackの装飾で、ボタンを追加し、処理なんかを追加したらより複雑なことが出来る。
いつかやってみたい。