サイト死活監視シェルスクリプトに Slack 通知機能を追加する方法

はじめに

サイトの死活監視スクリプトに Slack 通知機能を追加する方法をご紹介します。本記事では、既存の監視スクリプトに新たに Slack 通知機能を実装し、監視結果のサマリーや異常検知時の情報を Slack チャンネルに送信できるようにします。

前提条件

修正内容

今回の修正では、以下の変更を加えました。

  1. Slack 通知用の関数を追加
    Slack Webhook を利用して、指定したメッセージを Slack チャンネルに送信します。
  2. 監視結果(サマリー)の通知
    サマリー結果を Slack チャンネルに送信できるようにしました。
  3. 異常検知時の通知
    異常が検知された場合、Slack にも通知を送信するようにしました。

修正後の監視スクリプト

以下が修正版のスクリプト全体です。

#!/bin/bash

# パラメーターで指定された会社名を取得
company="$1"

# 配列の宣言
declare -A sites

# 設定ファイルのパスを作成
config_file="$(dirname "$0")/config_${company}.sh"

# 設定ファイルが存在するかチェック
if [[ ! -f "$config_file" ]]; then
    echo "エラー: 設定ファイル '${config_file}' が見つかりません。"
    exit 1
fi

# 設定ファイルの読み込み
source "$config_file"

# 実行開始時間の取得
start_time=$(date "+%Y-%m-%d %H:%M:%S")

# メール通知関数
send_email() {
    local site=$1
    local emails=$2
    local status_code=$3
    local status_message=$4
    local subject="【サイト監視】$site は$status_message (HTTPステータスコード: $status_code)"
    local body="【サイト監視結果】\n\n日時: $start_time\n\n対象サイト: $site\n状態: $status_message\nHTTPステータスコード: $status_code\n\nご確認ください。"

    # メール送信 (BCCに当社のメールアドレスを追加)
    echo -e "$body" | mail -s "$subject" -b "$bcc_email" "$emails"
}

# Chatwork 通知関数
send_chatwork_notification() {
    local message=$1
    local room_id=$2
    curl -X POST -H "X-ChatWorkToken: $chatwork_api_token" \
        -d "body=$message" \
        "https://api.chatwork.com/v2/rooms/$room_id/messages"
}

# Slack 通知関数
send_slack_notification() {
    local message=$1
    curl -X POST -H 'Content-type: application/json' --data "{\"text\": \"$message\"}" "$slack_webhook_url"
}

# サマリー通知用の変数
summary_subject="【サイト監視サマリー】全サイトの状態レポート"
summary_body="【サイト監視結果サマリー】\n\n日時: $start_time\n\n監視結果:\n\n"
alert_needed=false  # 異常検知のフラグ
alert_summary_body="【サイト監視異常通知】\n\n日時: $start_time\n\n異常検知されたサイト:\n\n"

# サイトの死活監視
declare -A processed

for key in "${!sites[@]}"; do
    # site_keyをキーから抽出
    site_key="${key%%.*}"

    # 同じサイトを一度だけ処理
    if [[ -z "${processed[$site_key]}" ]]; then
        url="${sites[$site_key.url]}"
        emails="${sites[$site_key.email]}"
        email_notify="${sites[$site_key.notify]}"
        processed[$site_key]=1  # 処理済みマークを設定

        # curlを使ってサイトのHTTPステータスコードを取得
        status_code=$(curl -o /dev/null -s -w "%{http_code}" "$url")

        # ステータスコードによる通知内容の判断
        if [[ "$status_code" == "200" || "$status_code" == "301" || "$status_code" == "302" ]]; then
            status_message="正常に稼働中"
            # 正常時の通知
            if [[ "$email_notify" == "true" && -n "$emails" ]]; then
                send_email "$url" "$emails" "$status_code" "$status_message"
            fi
        else
            # 異常時の通知メッセージを設定
            if [[ "$status_code" == "503" ]]; then
                status_message="サービスが一時的に利用できません"
            else
                status_message="ダウンしています"
            fi

            # メール通知の条件確認
            if [[ "$email_notify" == "true" && -n "$emails" ]]; then
                send_email "$url" "$emails" "$status_code" "$status_message"
            fi
            alert_needed=true
            alert_summary_body+="$url\n  状態: $status_message\n  ステータスコード: $status_code\n\n"
        fi

        # サマリーの内容を追加
        summary_body+="$url\n  状態: $status_message\n  ステータスコード: $status_code\n\n"
    fi
done

# サマリー通知の送信 (メール)
echo -e "$summary_body" | mail -s "$summary_subject" -b "$bcc_email" "$bcc_email"

# サマリー通知の送信 (Chatwork)
encoded_summary_body=$(echo -e "$summary_body" | sed ':a;N;$!ba;s/\n/%0A/g')
send_chatwork_notification "$encoded_summary_body" "$chatwork_room_id"

# サマリー通知の送信 (Slack)
slack_message="【サイト監視サマリー】\n\n日時: $start_time\n\n監視結果:\n\n$summary_body"
send_slack_notification "$slack_message"

# 異常が検知された場合、追加のChatworkとメール通知を実行
if [ "$alert_needed" = true ]; then
    # 異常通知の送信 (メール)
    echo -e "$alert_summary_body" | mail -s "【サイト監視異常通知】異常が検知されました" "$alert_email"

    # 異常通知の送信 (Chatwork)
    encoded_alert_summary_body=$(echo -e "$alert_summary_body" | sed ':a;N;$!ba;s/\n/%0A/g')
    send_chatwork_notification "$encoded_alert_summary_body" "$alert_chatwork_room_id"

    # 異常通知の送信 (Slack)
    slack_alert_message="【サイト監視異常通知】\n\n日時: $start_time\n\n異常検知されたサイト:\n\n$alert_summary_body"
    send_slack_notification "$slack_alert_message"
fi

設定ファイルの変更

Slack Webhook URL を config ファイルに追加しました。

# Slack Webhook URL
slack_webhook_url="https://hooks.slack.com/services/XXXX/YYYY/ZZZZ"

まとめ

  • Slack 通知機能を追加したことで、監視結果をリアルタイムに共有できるようになりました。
  • Chatwork、メール通知もそのまま維持されています。
  • 今後、Microsoft Teams や LINE などの通知先を追加したい場合も、関数を追加するだけで簡単に対応可能です。

関連記事

コメント

タイトルとURLをコピーしました