著者は、 Write for DOnations プログラムの一環として、 Apache SoftwareFoundationを選択して寄付を受け取りました。

序章

重要なWebサイトがある場合は、問題が発生していることを知り、ユーザーに影響が出る前に修正できるようにする必要があります。 通知を受信する1つの方法は、テキストベースのチャットシステムを介してアラートを設定することです。

Discord は、Slackに似たホスト型チャットシステムです。 Discordを使用すると、テキストメッセージ、画像、オーディオ、およびビデオと通信できる無料のメッセージングシステムをセットアップできます。 プレミアム機能を提供しますが、無料でサインアップでき、Windows、macOS、Linux、Android、iOSで利用できるクライアントがあります。

このチュートリアルでは、独自のDiscordサーバーを構成し、Discord Webhookを作成し、WebサイトのリストのステータスをチェックするBashスクリプトを記述し、サーバーからDiscordチャネルへの通知をテストします。

前提条件

このガイドを開始する前に、次のものが必要です。

  • 監視スクリプトを実行してDiscordと通信するUbuntu18.04サーバー( monitor-server )。 このサーバーは、この初期サーバーセットアップガイドに従ってセットアップできます。

  • 監視したいWebサイトがまだない場合は、apache-serverUbuntu18.04にApacheWebサーバーをインストールする方法で設定し、必ず手順を完了してください。 5仮想ホストの設定について。

  • Discordアカウント。 Discord登録ページにアクセスして、無料のDiscordアカウントにサインアップできます。

ステップ1—DiscordWebhookを設定する

Discordアカウントを開設したら、独自のプライベートDiscordサーバーを作成できます。

まず、ブラウザで Discordアカウントにログインするか、 Discordアプリを起動して、サーバーの作成ボタンをクリックします。

Create server or Join server Discord

次に、サーバーの名前を選択し、サーバーの作成ボタンをクリックします。

次に、DiscordWebhookを構成します。 Webhookは、サービスをリンクするために使用できる一意のURLです。 DiscordのWebhookを使用すると、メッセージを自動化し、データの更新をDiscordテキストチャネルに送信できます。

このチュートリアルでは、サーバー上の特定のサービスがダウンしたときにWebhookに通知を送信し、Discordはそれらのメッセージをチャネルで確実に受信するようにします。

Webhookを作成するには、最初にチャンネルをクリックしてから、チャンネル名のすぐ横にあるチャンネルの編集ボタンをクリックする必要があります。

Channel settings Discord

次に、 Webhook タブをクリックし、Webhookの作成ボタンをクリックします。

Create Webhook Button Discord

その後、Webhookの名前を選択します。このチュートリアルでは、Alertsを使用します。これは、Bashスクリプトが実行する機能であり、Webサイトの1つがダウンした場合に警告します。

WebhookのURLをコピーして、後で使用できるように保存します。 最後に、保存ボタンをクリックします。

Create webhook Discord

これで、Discordアカウント、サーバー、およびWebhookが作成されました。 これで、スクリプトが監視するテストファイルの作成に進むことができます。

ステップ2—テストファイルの作成(オプション)

まだテストする独自のWebサイトがない場合は、この手順を実行してテストファイルを追加し、監視スクリプトがどのように機能するかを確認します。 これらのコマンドは、必ずapache-serverで実行してください。

まず、次のコマンドを使用してテストファイルを作成します。

  1. nano /var/www/your_domain/test

ファイルにコンテンツを追加して、ファイルが機能していることを確認できるようにします。

テスト
test

ファイルを保存して終了します。

次に、ブラウザでhttp://your_domain/testに移動して、testファイルのテキストを受信できることを確認します。

次のステップでは、監視スクリプトの作成を開始します。

ステップ3—モニタリングスクリプトの作成

Webhookを構成したので、次に、Webサイトの応答コードをチェックするBashスクリプトを作成します。 いずれかのWebサイトが200 OKとは異なるステータスを返す場合、スクリプトはDiscord Webhookにリクエストを送信するため、Discordチャネルで通知を受け取ります。

注:他のプログラミング言語を使用して、このようなスクリプトを作成できます。

まず、監視スクリプトの実行に使用しているmonitor-serverにSSHで接続します。

ホームフォルダにファイルを作成することから始めます。 このチュートリアルでは、ファイルをcheck_status.shと呼びます。

お気に入りのテキストエディタでファイルを開きます。

  1. nano ~/check_status.sh

プログラムローダーがこの実行可能ファイルをBashスクリプトとして認識するようにするには、ファイルの先頭に次の行を追加します。

〜/ check_status.sh
#!/bin/bash

#で始まるすべての行はコメントです。 コメントはオプションですが、スクリプトにコメントを含めると、他の人がスクリプトの機能を理解しやすくなります。

〜/ check_status.sh
#!/bin/bash

##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##
. . .

次に、DiscordWebhookを変数として指定します。 Webhook用に以前にコピーしたURLを追加します。

〜/ check_status.sh
. . .
##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"
. . .

このスクリプトを使用して複数のWebサイトのステータスを確認する可能性があるため、websites_listという変数を作成し、監視するWebサイトのドメイン名またはIPアドレスを保存します。 このチュートリアルでオプションのテストファイルを使用している場合は、ドメイン名またはIPアドレスの後に/testを追加してください。

〜/ check_status.sh
. . .
##
# List of websites to check
##
websites_list="your_domain/test"
. . .

複数のWebサイトを監視している場合は、websites_list変数にドメイン名またはIPアドレスを追加し、スペースを区切り文字として使用できます。

〜/ check_status.sh
. . .
websites_list="your_domain1/test your_domain2 your_domain3"
. . .

次に、Webサイトのリストをループして、それらのステータスを確認します。 これを行うには、次のforループをファイルに追加します。

〜/ check_status.sh
. . .
for website in ${websites_list} ; do
        status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})
        echo $status_code
done
. . .

このforループは、websites_list変数の各項目を調べ、curlコマンドを使用してWebサイトのステータスを確認します。

echo $status_codeステートメントは、curlコマンドの応答ステータスを出力します。 Webサイトが期待どおりに実行されている場合、curlコマンドは応答コード200 OKを返します。これは、Webサイトが稼働中であることを意味します。 それ以外の場合は、別の応答コードを受け取ります。

forループ内に、ifステートメントを追加して、応答コードが200であるかどうかを確認します。 応答コードが200の場合、これはWebサイトが実行されていることを意味し、Discord通知は必要ありません。 次の条件付きブロックをファイルに追加します。

〜/ check_status.sh
. . .
        if [[ "$status_code" -ne 200 ]] ; then
            # POST request to Discord Webhook with the domain name and the HTTP status code
        else
            echo "${website} is running!"
        fi
. . .

Webサイトに問題がある場合は、別の応答コードが表示されます。この場合、DiscordWebhookを介して通知を受信する必要があります。

通知を送信するには、curlコマンドを使用して、POSTリクエストをDiscordWebhookURLに送信します。

ifステートメント内に次のcurlリクエストを追加します。

〜/ check_status.sh
. . .
        if [[ "$status_code" -ne 200 ]] ; then
            # POST request to Discord Webhook with the domain name and the HTTP status code
            curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} returned: ${status_code}"'"}'  $url
        else
            echo "${website} is running!"
        fi
. . .

次に、さまざまな引数を調べてみましょう。

  • -H:リクエストにヘッダーを追加することをcurlに通知します。
  • "Content-Type: application/json":Webhookが期待するデータ型(HTTP JSON)を定義します。
  • -X POST:リクエストメソッドとしてPOSTを使用することを指定します。
  • -d:指定されたJSONデータをDiscordWebhookに送信します。

これがスクリプトの最終バージョンになります。

〜/ check_status.sh
#!/bin/bash
##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##

##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"

##
# List of websites to check
# To add more websites just use space as a separator, for example:
# websites_list="your_domain1 your_domain2 your_domain3"
##
websites_list="your_domain/test your_domain2"

for website in ${websites_list} ; do
        status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})

        if [[ "$status_code" -ne 200 ]] ; then
            # POST request to Discord Webhook with the domain name and the HTTP status code
            curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} : ${status_code}"'"}'  $url
        else
            echo "${website} is running!"
        fi
done

スクリプトはこのリストをループし、各Webサイトのステータスを確認します。

次のコマンドを使用してスクリプトを実行し、期待どおりに機能することを確認します。

  1. bash ~/check_status.sh

スクリプトを実行すると、Webサイトが実行されていることを確認する次の出力が端末に表示されます。

Output
your_domain1 is running! your_domain2 is running!

次に、Discord通知をテストします。

ステップ4—不和の通知をテストする

次に、テストファイルを使用して、Webhookが期待どおりに機能しているかどうかを確認します。

apache-server で次のコマンドを実行して、このファイルへのアクセス許可閉じます。

  1. sudo chmod 000 /var/www/your_domain/test

次に、 monitor-server に戻り、スクリプトを実行します。

  1. bash check_status.sh

Discordアプリに移動してアラートを確認すると、:403エラーが発生します。 これは、権限が正しく設定されておらず、ファイルの表示が禁止されていることを示しています。

ここで、別のエラーをテストするには、このファイルをapache-serverから完全に削除します。

  1. sudo rm /var/www/your_domain/test

次に、 monitor-server に戻り、スクリプトを実行します。

  1. bash check_status.sh

Discordアプリに移動してアラートを確認すると、:404エラーが発生します。 これは、ファイルが使用できないことを示しています。

お使いの携帯電話にDiscordがインストールされている場合は、そこにもアラートが表示されます。

これで、Webサイトで問題が発生したときに警告するスクリプトができました。 次に、5分ごとに自動的に実行されるようにスクリプトを構成しましょう。

ステップ5—プロセスの自動化

チェックを自動化する方法の1つは、5分程度ごとに実行されるcronジョブを作成することです。

まず、monitor-serverに戻ります。 次に、スクリプトを自動的に実行する前に、ファイルのアクセス許可を整理し、スクリプトが実行可能であることを確認する必要があります。実行可能でない場合、スクリプトは実行されません。 スクリプトを実行可能にするには:

  1. chmod u+x ~/check_status.sh

以下を実行してcrontabを編集します。

  1. crontab -e

次に、ファイルに以下を追加します。

*/5 * * * * /home/your_user/check_status.sh

次に、crontabを保存すると、スクリプトが5分ごとに実行されます。

結論

この記事では、独自のDiscord Webhookを構成し、Webサイトで特定のエラーが発生した場合に通知するスクリプトを作成しました。 これで、お気に入りのプログラミング言語を使用して、より複雑なボットを作成できます。

監視インフラストラクチャの設定の詳細については、監視トピックページをご覧ください。

また、シェルスクリプトについて詳しく知りたい場合は、シェルスクリプト入門チュートリアルシリーズをご覧ください。

Discord Webhookの詳細については、DiscordWebhookの公式ドキュメントを確認してください。