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に入れない

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ