astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

Monit+Webhookでslack通知してみる

f:id:astamuse:20180709175656p:plain

お久しぶりです。インフラ・開発部のyanagitaです。
変わらず宮崎からリモートワークを行っております。

弊社ではサービス障害や優先度の高いインシデントの発生時に開発メンバー全員へのメール通知と合わせて、 担当のスケジューリングとエスカレーション機能を持つ外部サービス(https://www.pagerduty.com/)を使用していち早く対応を行っています。
ただ、中にはそれほど優先度の高くないインシデントや限られたメンバーのみで検知したい事があります。
そこで今回はその条件を満たす例として、Monit + Slackのwebhookを利用してSlackに通知する方法を紹介したいと思います。

とりあえず、全体図

f:id:astamuse:20180709175556j:plain 全体図は非常にあっさりしています。
前述したとおり、サーバ内の異常をMonitで検知して、MonitからSlackのWebhookにメッセージを送信するShellをキックする流れとなります。

では、手順を紹介します。

着信Webフックの登録

着信Webフックとは、着信Webフック用のURLに向けてメッセージをPostするだけでSlack上にメッセージを表示することできるインテグレーション用のアプリになります。
まず、着信Webフックの登録に移ります。
※ サインオン前提で進めます。

slack.com

登録はアイコン下の「設定を追加」から行います。ざっと手順は下記の通りです。

  1. メッセージを投稿するチャンネルの選択する。

  2. 以下の項目を他の着信Webフックと被らないよう変更する。
     ・着信Webフック名
     ・アイコン

ここでWebhook URLの値がPost用のURLになりますので取扱いにご注意ください。

通知Shellの実装

Webhook URLをキックするShellを実装します。以下は簡略化したサンプルです。

/opt/slack/SlackNotification.sh

#!/bin/bash

# 着信Webフックで発行したWebhook URL
webHookUrl="https://hooks.slack.com/services/XXXXXXXX/YYYYYYYY/0123456789abcdefg"

# メッセージの情報はjson形式で定義します。
# パラメータの詳細はこちら(https://api.slack.com/docs/message-attachments#when_to_use_attachments)
payload='payload={
  "attachments": [
    {
      "color": "warning",
      "fields": [
        {
          "title" : "サンプル警告タイトル",
          "value" : "サンプル警告メッセージ"
        }
      ]
    } 
  ]
}'

# Webhoookに向けてメッセージ情報をPostします。
curl -s -X POST --data-urlencode "$payload" $webHookUrl

出力結果はこんな感じです。
f:id:astamuse:20180710102626p:plain

メッセージの表示フォーマットは細かくカスタマイズ可能です。気になる方はこちらをご確認ください。

api.slack.com

payloadのメッセージ確認はこちらで行うも事ができます。
Message Formatting | Slack

Monitの設定

Monitではサーバ内の細かいチェックが可能ですが、今回はlogファイルにworningが出力されたタイミングでSlackに通知させたいと思います。
Monitの設定は以下の通りです。

check file sample_notification with path /opt/batch/sample_batch/logs/application.log
    if match "WORN" then exec "/opt/slack/SlackNotification.sh"

check fileで監視ファイルを指定し、3行目のif match句で警告ログを検知させます。検知した際は通知Shellをキックさせるためexec句で通知Shellのパスを指定します。
この時、monitの設定で検知時にメールを送信する設定を入れている場合は、通知をSlackのみに限定したいのでnoalert句でメール通知を停止させます。

check file sample_notification with path /opt/batch/sample_batch/logs/application.log
    noalert xxxxxxxx@test.astamuse.co.jp
    if match "WORN" then exec "/opt/slack/SlackNotification.sh"

以上の工程で簡単にSlackへの通知が可能になります。

最後に

monit+webhookの組み合わせでSlackへの簡単な通知を紹介ました。
通知Shellの実装次第で詳細な情報の通知することもできますし、webhookの追加開発を行えば誰が対応しているかSlack上で共有することも可能です。

アスタミューゼではまだまだエンジニア&デザイナを募集しています。 気になる方は下からご応募下さい!新しい出会いをメンバー一同お待ちしてます!

Copyright © astamuse company, ltd. all rights reserved.