著者は、 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アプリを起動して、サーバーの作成ボタンをクリックします。

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

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

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

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

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

その後、Webhookの名前を選択します。このチュートリアルでは、 Alerts これが私たちのBashスクリプトが行うことなので、私たちのWebサイトの1つがダウンした場合に警告します。

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

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

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

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

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

  1. nano /var/www/your_domain/test

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

テスト
test

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

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

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

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

Webhookを構成したので、次に、Webサイトの応答コードをチェックするBashスクリプトを作成します。 いずれかのウェブサイトがとは異なるステータスを返した場合 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アドレスを保存します。 このチュートリアルでオプションのテストファイルを使用している場合は、必ず追加してください /test ドメイン名またはIPアドレスの後:

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

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

〜/ 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 変数を使用して、Webサイトのステータスを確認します。 curl 指図。

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

内部 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へのリクエスト。

以下を追加します curl あなたの中のリクエスト if 声明:

〜/ 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の公式ドキュメントを確認してください。