はじめに
こんにちは!
前回はLambda作成編ということで、ZabbixからのWebhookを受け取ってログに出力するだけのシンプルなLambda関数を作りました!
前回の記事はこちら↓
【AWS Lambda作成編】Zabbix × ServiceNow × AWX × Bedrockで障害初動対応を自動化してみた
今回はZabbix設定編②として、ZabbixのメディアタイプとActionを設定して
実際にZabbixからLambdaにWebhookを投げるところまでやっていきます!
今回のゴール
ZabbixがNW機器の障害/復旧を検知したとき、LambdaにWebhookが届くことを確認することをゴールとします。
Lambdaまで届いてCloudWatch Logsにログが出力されればOKです!
今回の流れ
| # | 内容 |
|---|---|
| 1 | ZabbixからLambdaまでの仕組みを整理する |
| 2 | メディアタイプの作成 |
| 3 | ユーザーへのメディアタイプ紐付け |
| 4 | Actionの設定 |
| 5 | 動作確認 |
ZabbixからLambdaまでの仕組みを整理する
まず、設定する前にZabbixのアラート通知の仕組みを整理しておきましょう。
Zabbixがアラートを外部に通知するとき、以下の3つが連携して動きます。
[メディアタイプ] どこに・どうやって・何を送るかを定義する
↓
[ユーザーへの紐付け] そのメディアをどのユーザーが使うかを設定する
↓
[Action] どのトリガーが発火したとき・誰に通知するかを設定する
この3つを設定してで初めてWebhookが動きます。
メディアタイプだけ作っても通知されないのでそこは注意が必要です!
通信の流れ
[Zabbix] トリガー発火
↓
[Action] 通知条件を判定
↓
[メディアタイプ] JavaScriptでLambdaにHTTPS POST
↓
[Lambda 関数URL]
↓
[CloudWatch Logs] ログ出力
メディアタイプの作成
では実際にメディアタイプの作成からしていきましょう。
Zabbixにログインしたら
アラート → メディアタイプ → メディアタイプの作成
の順にクリックします。
メディアタイプタブの設定
まずタイプを「Webhook」に変更します。
名前は作成したLambdaの名前の前にToと入れときましょう。
| 項目 | 設定値 |
|---|---|
| 名前 | To-verification-lambda |
| タイプ | Webhook |
パラメーターの設定
続いてパラメータを設定していきます。
タイプをWebhookにするとパラメーター欄が表示されます。
デフォルトでは以下が入力されている状態です。
HTTPProxy・Toについては今回使わないので削除します。
| 名前 | 値 | 必要可否 |
|---|---|---|
| URL | 空 | 〇 |
| HTTPProxy | 空 | × |
| To | {ALERT.SENDTO} | × |
| Subject | {TRIGGER.NAME} | 〇 |
| Message | {ALERT.MESSAGE} | 〇 |
To の行 → 削除
HTTPProxy の行 → 削除
削除ができたら各項目に以下を設定していきます。
| 名前 | 値 |
|---|---|
| URL | 前回発行したLambdaの関数URL |
| Subject | {TRIGGER.NAME} |
| Message | {ALERT.MESSAGE} |
{ALERT.MESSAGE}とは?
Zabbixのマクロ(変数)で、メッセージテンプレートで設定したメッセージ本文が展開されます。
後述のメッセージテンプレートでJSONを設定するので、ここではそのまま {ALERT.MESSAGE} を使います。
設定出来たらスクリプトを作っていきます。
スクリプトの設定
スクリプト欄の編集アイコン(鉛筆)をクリックして、以下のJavaScriptを書いていきます。
var params = JSON.parse(value);
var url = params.URL;
var subject = params.Subject;
var message = params.Message;
var data;
try {
data = JSON.parse(message);
} catch(e) {
data = {
event_type: "PROBLEM",
event_id: "0",
subject: subject,
description: message
};
}
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
var body = JSON.stringify({
event_type: data.event_type || "PROBLEM",
event_id: data.event_id || "0",
host: data.host || "",
trigger_name: data.trigger_name || subject
});
var resp = req.post(url, body);
var code = req.getStatus();
if (code != 200) {
throw 'Lambda request failed. HTTP code: ' + code + ', response: ' + resp;
}
return resp;
なんでJavaScriptが必要なのか
ZabbixのWebhookはJavaScriptでHTTPリクエストを自由に組み立てられる構造とになっています。
このスクリプトに「どのURLに」「どんなJSON形式で」POSTするかを定義しています。
message の中身(メッセージテンプレートで設定するJSON)をパースして、POSTするLambdaが読める形に整形してから送っています。
最後に適用をクリックしましょう!
メッセージテンプレートの設定
続いてメッセージテンプレートを設定します。
「メッセージテンプレート」タブをクリック → 追加
今回は障害時と復旧時で2つ設定します。
障害時テンプレート
| 項目 | 設定値 |
|---|---|
| メッセージタイプ | 障害 |
| 件名 | {TRIGGER.NAME} |
| メッセージ | 以下のJSON |
{
"event_type": "PROBLEM",
"event_id": "{EVENT.ID}",
"host": "{HOST.NAME}",
"trigger_name": "{TRIGGER.NAME}"
}
復旧時テンプレート
| 項目 | 設定値 |
|---|---|
| メッセージタイプ | 障害復旧 |
| 件名 | RECOVERY: {TRIGGER.NAME} |
| メッセージ | 以下のJSON |
{
"event_type": "RECOVERY",
"event_id": "{EVENT.ID}",
"host": "{HOST.NAME}",
"trigger_name": "{TRIGGER.NAME}"
}
メッセージテンプレートのJSONとLambdaコードのキーを合わせている
前回のLambda作成編で書いたコードは event_type・host・trigger_name をbodyから取り出しています。
このJSONのキー名がそのままLambdaのコードに渡ってくるので、キー名は合わせておく必要があります。
今回はまだServiceNowとの連携はしていないのでキーはこれだけになりますがServiceNow連携するときはさらに追加でキーを設定する必要があります。
そこは後続の記事でまた設定記事出そうと思います。
「追加」で保存したらメディアタイプの設定は完了です!
ユーザーへのメディアタイプ紐付け
続いてユーザーの紐づけを行います。
どのユーザーがそのメディアタイプを使って通知するかを設定する必要があるので
まずはユーザーを作成しましょう!
ユーザー → ユーザー → ユーザーの作成
| 項目 | 設定値 |
|---|---|
| ユーザー名 | verification-lambda-User |
| 名 | verification-lambda |
| 姓 | User |
| パスワード | 任意 |
| パスワード(確認) | 設定したパスワード |
次に権限つけるので権限タブクリック
| 項目 | 設定値 |
|---|---|
| ユーザーの役割 | Admin-role |
最後にメディアタブクリック
| 項目 | 設定値 |
|---|---|
| タイプ | To-verification-lambda |
| 送信先 | dummy |
| 有効 | チェックあり |
「追加」して保存しましょう!
送信先に dummy と入れている理由
今回のWebhookスクリプトは送信先({ALERT.SENDTO})を使っていないので、実際には参照されません。
ただし空白のまま保存ができないので任意の文字列を入れておきます。
Actionの設定
最後にActionを設定します。
Actionは「どのトリガーが発火したとき」「誰に」「どのメディアで通知するか」を定義するものです。
では実際に設定しましょう。
今回はLambdaまで届くかのテストなので名前は仮でつけておきます。
通知 → アクション → トリガーアクション → アクションの作成
アクションタブ
| 項目 | 設定値 |
|---|---|
| 名前 | Lambdaテスト |
| 有効 | チェックあり |
実行条件はデフォルトのままでOKです。
実行内容(障害時)
**「実行内容」タブをクリック → 実行内容欄の追加 **
| 項目 | 設定値 |
|---|---|
| ユーザーに送信 | verification-lambda-User |
| 送信メディアタイプ | To-verification-lambda |
実行内容(復旧時)
「実行内容」タブをクリック → 復旧時の実行内容欄の追加
| 項目 | 設定値 |
|---|---|
| 処理内容 | メッセージの送信 |
| ユーザーに送信 | verification-lambda-User |
| 送信メディアタイプ | To-verification-lambda |
最後に「追加」を押して追加します。
動作確認
ここまでお疲れさまでした!
ようやく設定が全部整ったので実際に動かしてみましょう!
Zabbix設定編①でやったのと同じ手順で、CiscoのインターフェースをShut→no shutします。
enable
conf t
interface GigabitEthernet1/0/1
shutdown
Zabbixが障害を検知したら、Lambda側のCloudWatch Logsを確認します。
Lambdaコンソール → verification-lambda → モニタリングタブ → CloudWatch Logsで表示
以下のようなログが出ていれば成功です!
event_type : PROBLEM
host : devnetsandboxiosxec9k.cisco.com
trigger_name: Cisco Interface Down検知
[PROBLEM] 障害を受信しました
確認できたら復旧させます。
no shutdown
復旧のログも確認します。
event_type : RECOVERY
host : devnetsandboxiosxec9k.cisco.com
trigger_name: Cisco Interface Down検知
[RECOVERY] 復旧を受信しました
まとめ
今回は、ZabbixのメディアタイプとActionを設定して、実際にLambdaまでWebhookが届くことを確認できました!Zabbix設定編①で作ったトリガーが起点となって、Lambdaまでつながる基本のパイプラインができましたね。
今回やったことをまとめます。
| # | やったこと |
|---|---|
| 1 | メディアタイプの作成(Webhook / スクリプト / メッセージテンプレート) |
| 2 | ユーザーへのメディアタイプ紐付け |
| 3 | Actionの作成(障害時・復旧時) |
| 4 | Cisco機器のShut/no shutで動作確認 |
次回はLambdaにServiceNow連携を追加して、ZabbixのアラートからServiceNowへ自動起票されるところまでやっていきます!









