エスカレーションポリシーで Webhook を使用する
Webhookを使用して、Splunk On-Callエスカレーションポリシーからアプリケーションへのコールバックを指定します。
Webhook は、Splunk On-Call から独自のアプリケーションへのコールバックを指定する方法であり、チームのエスカレーションポリシーに追加することで、インシデントの詳細を受信し、希望する方法で処理することができます。エスカレーションポリシーの詳細については「エスカレーションポリシーを設定する」を参照してください。
これらの使い方の例をいくつか挙げます:
-
サーバープロセスに関連するインシデントが発生すると、自動的にバウンスします。
-
Splunk On-Callインシデントを独自のサービスダッシュボードに統合します。
-
最新の停止状況ページを維持します。
Webhookのコンテンツタイプ:application/x-www-form-urlencoded
はじめに
開始するには Splunk On-Call タイムラインから [Integrations] に移動し、[Webhooks] を選択します。
Webhook の [Name] と [URL] の入力を求められます。送信すると、[Auth Code] が生成されます。
Webhook リクエストの認証
Webhook を作成すると、安全でランダムな認証トークンが生成されます。POST リクエストはこの鍵で署名されるため、Splunk On-Call からのリクエストであることを確認できます。
Splunk On-CallからアプリケーションにPOSTリクエストが届いていることを認証するには、以下の手順を実行します:
-
WebhookのURLを、Splunk On-Callで表示されるのと同じ文字列で作成します。これには、末尾のスラッシュも含まれます。
-
リクエストの POST 変数をキーでアルファベット順に並べ替えます。
-
各 POST 変数のキーと値を、区切り文字なしで URL 文字列に追加します。
-
Webhook の認証キーを使用して、結果の文字列のバイナリハッシュを MAC-SHA1 で作成します。
-
バイナリ署名をBase64エンコードします。
-
リクエスト内のX-VictorOps-Signatureキーと出力を比較し、一致すれば、リクエストの発信元はSplunk On-Call (旧VictorOps)です。
SSL 証明書チェーンの検証
Webhook が安全な接続を使用する場合(すなわち、URL が「https://」で始まる場合)、受信側のエンドポイントは、公認の認証局によって署名された有効な SSL 証明書を使用する必要があります。
この推奨は SSL Labs Best Practices に基づいて実施されました。
Webhook エスカレーションステップ
Webhook がチームのエスカレーションポリシーの一部である場合、インシデントがエスカレーションされると、サービスは HTTP POST リクエストを受信します。リクエストには以下の情報が含まれます。
POST本文:
-
インシデント: Splunk On-Callでのインシデントの識別子。
-
概要:インシデントの簡単な説明。
-
メッセージ:インシデントに関するメッセージ。
HTTPヘッダー
-
X-Victorops-Signature: Splunk On-Call (旧VictorOps)のWebhookの認証キーに基づく署名。
Webhookがあれば、それをエスカレーションポリシーに追加することができます。
エスカレーションとカスタム発信Webhookの違い
カスタム発信 Webhook の詳細については「Splunk On-Call のカスタムアウトバウンド Webhook」を参照してください。
参照用サンプル Scala コード
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec import javax.xml.bind.DatatypeConverter
def generateSignature(key: String, url:String, postData: Map[String, String]) = {
val contents =postData.toList.sorted.foldLeft(url) { case (s, (key, value)) =>s"\ :math:`s`\ key$value" }
val mac = Mac.getInstance("HmacSHA1")
mac.init(new SecretKeySpec(key.getBytes, "HmacSHA1"))
DatatypeConverter.printBase64Binary(mac.doFinal(contents.getBytes("utf-8")))
}