2026年7月29日
2026年7月29日
スクリプトの実行結果をSlackに通知する方法
はじめに
バックアップやデプロイの結果がメールだけだと埋もれて気づきません。Slackにリアルタイム通知すれば、成功・失敗の即時把握とチーム共有が同時にできます。
SlackのIncoming Webhookはトークン1本でcurl送信できるため最小コストで導入可能です。本記事ではエラー時のみ通知、@channelメンション、リッチなBlock Kit形式までを解説します。
症状・背景
- バックアップ失敗を翌朝のメール確認で気づき、復旧が遅れた
- 監視メールが多すぎて重要なものを見逃す
- チームで誰でも障害状況をリアルタイムに把握したい
- 成功時は静かにしたいが失敗時は確実に通知したい
手順・設定方法
ステップ1: Incoming Webhook URLの取得
# Slack管理画面で:
# 1) Apps → "Incoming Webhooks" を追加
# 2) チャンネル選択 → Webhook URL を取得
# 例: https://hooks.slack.com/services/T000/B000/XXXXXXX
# URLは秘匿。ファイル権限600で保存
sudo install -m 600 /dev/null /etc/secrets/slack-webhook
echo "https://hooks.slack.com/services/T000/B000/XXXXXXX" | sudo tee /etc/secrets/slack-webhook
ステップ2: 最小限のcurl通知
# シンプル通知(プレーンテキスト)
WEBHOOK=$(cat /etc/secrets/slack-webhook)
curl -fsS -X POST -H 'Content-Type: application/json' \
--data '{"text":"バックアップ成功: srv01"}' "$WEBHOOK"
# 色とフィールド付き(attachments形式)
curl -fsS -X POST -H 'Content-Type: application/json' \
--data '{"attachments":[{"color":"good","title":"backup OK",
"fields":[{"title":"host","value":"srv01","short":true},
{"title":"size","value":"1.2GiB","short":true}]}]}' \
"$WEBHOOK"
ステップ3: 成功・失敗で出し分ける関数
#!/bin/bash
WEBHOOK=$(cat /etc/secrets/slack-webhook)
notify_slack() {
local level=$1 msg=$2 color
case $level in
ok) color=good ;;
warn) color=warning ;;
err) color=danger; msg="<!channel> $msg" ;;
esac
jq -nc --arg c "$color" --arg t "$msg" \
'{attachments:[{color:$c,text:$t,ts:now}]}' \
| curl -fsS -X POST -H 'Content-Type: application/json' --data @- "$WEBHOOK"
}
# バックアップ本体
if mysqldump --defaults-extra-file=/etc/mysql/backup.cnf --all-databases \
| gzip -9 > /var/backups/full.sql.gz; then
notify_slack ok "✅ srv01 バックアップ成功 (size=$(du -h /var/backups/full.sql.gz | cut -f1))"
else
notify_slack err "❌ srv01 バックアップ失敗 / 詳細: /var/log/backup/$(date +%F).log"
fi
ステップ4: Block Kitでリッチに表示
# Block Kitはセクション・ボタン・画像など柔軟なUIに対応
cat > payload.json <<'EOF'
{"blocks":[
{"type":"header","text":{"type":"plain_text","text":"バックアップレポート"}},
{"type":"section","fields":[
{"type":"mrkdwn","text":"*Host:*\nsrv01.example.com"},
{"type":"mrkdwn","text":"*Status:*\n:white_check_mark: success"},
{"type":"mrkdwn","text":"*Size:*\n1.2 GiB"},
{"type":"mrkdwn","text":"*Duration:*\n00:08:31"}
]},
{"type":"context","elements":[
{"type":"mrkdwn","text":"`/var/backups/full-20260514.sql.gz` 完了"}
]}
]}
EOF
curl -fsS -X POST -H 'Content-Type: application/json' --data @payload.json "$WEBHOOK"
注意事項
- Webhook URLは公開リポジトリにコミットしない。漏洩したらSlack側で再発行
- Slack APIにはレート制限がある(1秒1メッセージ目安)。バースト送信は避ける
やは全員通知になる。重大障害以外では使わない- curlが失敗してもスクリプトを止めないよう
--fail-with-bodyや|| trueでケアする
まとめ
1. Incoming Webhook: トークン1本で導入可能
2. 失敗時のみ@channel: ノイズを抑えつつ重大事案を確実に通知
3. attachments/Block Kit: 色・フィールドでひと目で状態が分かるUI
4. jq組み立て: 特殊文字を含むメッセージも安全にJSON化
5. シークレット保護: Webhook URLは600で配置・Gitに入れない
関連記事: