はじめに
サイトの死活監視スクリプトに Slack 通知機能を追加する方法をご紹介します。本記事では、既存の監視スクリプトに新たに Slack 通知機能を実装し、監視結果のサマリーや異常検知時の情報を Slack チャンネルに送信できるようにします。
前提条件
- サイト監視スクリプトが既に動作していること
- Slack Webhook URL を取得済みであること
Slack Webhook の詳細については、Slack API の公式ドキュメント を参照してください。
修正内容
今回の修正では、以下の変更を加えました。
- Slack 通知用の関数を追加
Slack Webhook を利用して、指定したメッセージを Slack チャンネルに送信します。 - 監視結果(サマリー)の通知
サマリー結果を Slack チャンネルに送信できるようにしました。 - 異常検知時の通知
異常が検知された場合、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 などの通知先を追加したい場合も、関数を追加するだけで簡単に対応可能です。
コメント