0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Zabbix設定編②】Zabbix × ServiceNow × AWX × Bedrockで障害初動対応を自動化してみた

0
Posted at

はじめに

こんにちは!
前回は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にするとパラメーター欄が表示されます。
デフォルトでは以下が入力されている状態です。
HTTPProxyToについては今回使わないので削除します。

名前 必要可否
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} を使います。

6.png

設定出来たらスクリプトを作っていきます。

スクリプトの設定

スクリプト欄の編集アイコン(鉛筆)をクリックして、以下の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が読める形に整形してから送っています。

image.png

最後に適用をクリックしましょう!

メッセージテンプレートの設定

続いてメッセージテンプレートを設定します。

「メッセージテンプレート」タブをクリック → 追加

今回は障害時と復旧時で2つ設定します。

障害時テンプレート

項目 設定値
メッセージタイプ 障害
件名 {TRIGGER.NAME}
メッセージ 以下のJSON
{
  "event_type": "PROBLEM",
  "event_id": "{EVENT.ID}",
  "host": "{HOST.NAME}",
  "trigger_name": "{TRIGGER.NAME}"
}

image.png

復旧時テンプレート

項目 設定値
メッセージタイプ 障害復旧
件名 RECOVERY: {TRIGGER.NAME}
メッセージ 以下のJSON
{
  "event_type": "RECOVERY",
  "event_id": "{EVENT.ID}",
  "host": "{HOST.NAME}",
  "trigger_name": "{TRIGGER.NAME}"
}

image.png

メッセージテンプレートのJSONとLambdaコードのキーを合わせている
前回のLambda作成編で書いたコードは event_typehosttrigger_name をbodyから取り出しています。
このJSONのキー名がそのままLambdaのコードに渡ってくるので、キー名は合わせておく必要があります。

今回はまだServiceNowとの連携はしていないのでキーはこれだけになりますがServiceNow連携するときはさらに追加でキーを設定する必要があります。
そこは後続の記事でまた設定記事出そうと思います。

「追加」で保存したらメディアタイプの設定は完了です!

ユーザーへのメディアタイプ紐付け

続いてユーザーの紐づけを行います。
どのユーザーがそのメディアタイプを使って通知するかを設定する必要があるので
まずはユーザーを作成しましょう!

ユーザー → ユーザー → ユーザーの作成

項目 設定値
ユーザー名 verification-lambda-User
verification-lambda
User
パスワード 任意
パスワード(確認) 設定したパスワード

image.png

次に権限つけるので権限タブクリック

項目 設定値
ユーザーの役割 Admin-role

image.png

最後にメディアタブクリック

項目 設定値
タイプ To-verification-lambda
送信先 dummy
有効 チェックあり

image.png

「追加」して保存しましょう!

送信先に dummy と入れている理由
今回のWebhookスクリプトは送信先({ALERT.SENDTO})を使っていないので、実際には参照されません。
ただし空白のまま保存ができないので任意の文字列を入れておきます。

Actionの設定

最後にActionを設定します。
Actionは「どのトリガーが発火したとき」「誰に」「どのメディアで通知するか」を定義するものです。
では実際に設定しましょう。

今回はLambdaまで届くかのテストなので名前は仮でつけておきます。

通知 → アクション → トリガーアクション → アクションの作成

アクションタブ

項目 設定値
名前 Lambdaテスト
有効 チェックあり

実行条件はデフォルトのままでOKです。

image.png

実行内容(障害時)

**「実行内容」タブをクリック → 実行内容欄の追加 **

項目 設定値
ユーザーに送信 verification-lambda-User
送信メディアタイプ To-verification-lambda

image.png

実行内容(復旧時)

「実行内容」タブをクリック → 復旧時の実行内容欄の追加

項目 設定値
処理内容 メッセージの送信
ユーザーに送信 verification-lambda-User
送信メディアタイプ To-verification-lambda

image.png

最後に「追加」を押して追加します。

動作確認

ここまでお疲れさまでした!

ようやく設定が全部整ったので実際に動かしてみましょう!
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へ自動起票されるところまでやっていきます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?