𝕏 f B! L
案件・求人数 12,345
案件を探す(準備中) エージェントを探す(準備中) お役立ち情報 ログイン
案件・求人数 12,345
OpenClawで通知パイプラインを自動化する方法|Slack・Discord・メール連携【完全攻略 Ep.17】

OpenClawで通知パイプラインを自動化する方法|Slack・Discord・メール連携【完全攻略 Ep.17】

OpenClaw通知自動化SlackDiscord
目次
⚡ 3秒でわかる!この記事のポイント
  • OpenClawはSlack・Discord・メールなど複数チャネルへの一元通知配信が可能
  • 条件分岐・フィルタリング・エスカレーションで賢い通知設計ができる
  • cronジョブ連携で監視・レポート通知を完全自動化

「Slackに通知を飛ばしたいけど、毎回スクリプトを書くのが面倒…」「重要な通知とそうでない通知を分けたい」「複数チャネルへの同時配信を自動化したい」

OpenClawの通知パイプライン機能を使えば、監視アラート・定期レポート・タスク完了通知などを、条件に応じて適切なチャネルに自動配信できます。

この記事では、OpenClaw完全攻略シリーズのEp.17として、通知パイプラインの設計から実装まで実践的に解説します。

この記事でわかること
  • OpenClawの通知配信アーキテクチャ
  • Slack・Discord・メール連携の設定方法
  • 条件付き通知のルーティング設計
  • エスカレーションの実装パターン
  • 通知テンプレートの管理と活用

OpenClawの通知パイプライン全体像

OpenClawによる通知パイプライン自動化の全体フロー

OpenClawの通知パイプラインは、トリガー → フィルタリング → テンプレート適用 → チャネル配信の4段階で構成されます。各段階をカスタマイズすることで、状況に応じた最適な通知を実現できます。

通知パイプラインの基本構成

┌──────────┐    ┌───────────┐    ┌──────────┐    ┌──────────┐
│ トリガー  │ → │ フィルタ   │ → │ テンプレ  │ → │ 配信先    │
│          │    │           │    │ ート適用  │    │          │
│ - cron   │    │ - 重要度  │    │ - Slack形 │    │ - Slack  │
│ - webhook│    │ - 時間帯  │    │   式     │    │ - Discord│
│ - event  │    │ - 条件式  │    │ - Discord │    │ - Email  │
│ - watch  │    │           │    │   形式   │    │ - SMS    │
└──────────┘    └───────────┘    └──────────┘    └──────────┘

Slack通知の設定

基本的なSlack通知

OpenClawからSlackへの通知は、messageツールを使用します:

# openclaw.json の channels 設定
{
  "channels": {
    "slack": {
      "type": "slack",
      "token": "${SLACK_BOT_TOKEN}",
      "defaultChannel": "#notifications"
    }
  }
}

通知の送信例:

// ワークスペースのスクリプトから通知送信
message({
  action: "send",
  target: "C0AF55LV0B0",  // #ses-base チャネルID
  message: "📊 日次レポートが完了しました\n\n" +
    "• PV数: 1,234 (+12%)\n" +
    "• ユニークユーザー: 856\n" +
    "• 直帰率: 42.3%"
});

Rich Format通知

Block Kit形式でリッチな通知を送信:

// 構造化されたレポート通知
message({
  action: "send",
  target: "#ses-base",
  message: "🚨 *サーバーアラート*\n\n" +
    "```\n" +
    "サーバー: production-web-01\n" +
    "CPU使用率: 95.2%\n" +
    "メモリ: 87.4%\n" +
    "ディスク: 72.1%\n" +
    "```\n\n" +
    "⏰ 検知時刻: 2026-03-11 14:23 JST\n" +
    "🔗 <https://grafana.example.com/d/abc|Grafanaダッシュボード>"
});

チャネル別の通知ルーティング

重要度に応じて通知先を変える設計:

function routeNotification(event) {
  const { severity, category, message } = event;

  // CRITICAL: 緊急チャネル + DM
  if (severity === 'critical') {
    message({
      action: "send",
      target: "#alerts-critical",
      message: `🔴 CRITICAL: ${message}`
    });
    message({
      action: "send",
      target: "@oncall-engineer",
      message: `🚨 緊急対応が必要です: ${message}`
    });
    return;
  }

  // WARNING: アラートチャネル
  if (severity === 'warning') {
    message({
      action: "send",
      target: "#alerts-warning",
      message: `🟡 WARNING: ${message}`
    });
    return;
  }

  // INFO: 一般通知チャネル
  message({
    action: "send",
    target: "#notifications",
    message: `ℹ️ ${message}`
  });
}

Discord通知の設定

Discord連携の基本

# openclaw.json でDiscord設定
{
  "channels": {
    "discord": {
      "type": "discord",
      "token": "${DISCORD_BOT_TOKEN}",
      "guildId": "1234567890"
    }
  }
}

Discord固有のフォーマット

Discordではマークダウンテーブルが使えないため、フォーマットを工夫します:

// Discord向けの日次レポート
function sendDiscordReport(data) {
  const report = [
    "📊 **日次レポート** — " + new Date().toLocaleDateString('ja-JP'),
    "",
    "**📈 アクセス指標**",
    `• PV数: **${data.pv.toLocaleString()}** (${data.pvChange})`,
    `• ユーザー数: **${data.users.toLocaleString()}** (${data.usersChange})`,
    `• セッション: **${data.sessions.toLocaleString()}**`,
    "",
    "**🔥 人気記事TOP3**",
    ...data.topArticles.map((a, i) => `${i + 1}. ${a.title} (${a.pv} PV)`),
    "",
    "**💡 注目ポイント**",
    data.highlight
  ].join('\n');

  message({
    action: "send",
    target: "discord-channel-id",
    message: report
  });
}

cronジョブとの連携

定期通知の設定

OpenClawのcronジョブ機能と組み合わせて定期通知を自動化:

// openclaw.json のcronジョブ設定
{
  "cron": [
    {
      "name": "daily-report",
      "schedule": "0 9 * * *",
      "prompt": "GA4のデータを取得して日次レポートをSlack #ses-baseに投稿してください",
      "channel": "slack:C0AF55LV0B0"
    },
    {
      "name": "weekly-summary",
      "schedule": "0 10 * * 1",
      "prompt": "先週のGA4データをまとめて週次サマリーを作成し、Slackに投稿してください",
      "channel": "slack:C0AF55LV0B0"
    },
    {
      "name": "server-health-check",
      "schedule": "*/30 * * * *",
      "prompt": "サーバーのヘルスチェックを実行し、異常があればアラートを送信してください",
      "channel": "slack:C0AF55LV0B0"
    }
  ]
}

イベント駆動通知

特定のイベントをトリガーにした通知:

// Git push時の自動通知
async function onGitPush(event) {
  const { branch, commits, author } = event;

  if (branch === 'main') {
    message({
      action: "send",
      target: "#deployments",
      message: [
        `🚀 **${author}** が main にプッシュしました`,
        "",
        `コミット数: ${commits.length}`,
        ...commits.slice(0, 5).map(c => `• \`${c.hash.slice(0,7)}\` ${c.message}`),
        commits.length > 5 ? `...他 ${commits.length - 5} コミット` : ""
      ].join('\n')
    });
  }
}

// GitHub Actionsの結果通知
async function onCIComplete(event) {
  const { status, workflow, duration, url } = event;
  const emoji = status === 'success' ? '✅' : '❌';

  message({
    action: "send",
    target: "#ci-cd",
    message: `${emoji} **${workflow}** — ${status}\n⏱️ ${duration}s\n🔗 <${url}|詳細>`
  });
}

エスカレーション設計

段階的エスカレーション

未対応の通知を段階的にエスカレートする設計:

class EscalationPipeline {
  constructor() {
    this.levels = [
      { delay: 0,    target: '#alerts',       mention: '' },
      { delay: 300,  target: '#alerts',       mention: '@channel' },
      { delay: 900,  target: '#alerts-urgent', mention: '@oncall' },
      { delay: 1800, target: 'dm',            mention: 'manager' },
    ];
  }

  async escalate(alert) {
    for (const level of this.levels) {
      if (alert.acknowledged) break;

      await sleep(level.delay * 1000);

      message({
        action: "send",
        target: level.target,
        message: [
          `🚨 ${level.mention} **エスカレーション Lv.${this.levels.indexOf(level) + 1}**`,
          "",
          `アラート: ${alert.title}`,
          `発生時刻: ${alert.timestamp}`,
          `未対応時間: ${Math.round(level.delay / 60)}分`,
          "",
          `⚡ \`/ack ${alert.id}\` で対応開始を宣言`
        ].join('\n')
      });
    }
  }
}

時間帯による通知制御

深夜の非緊急通知を抑制する設計:

function shouldNotify(severity, hour) {
  // 深夜帯(23:00-07:00)はCRITICALのみ通知
  if (hour >= 23 || hour < 7) {
    return severity === 'critical';
  }
  // 営業時間外(19:00-23:00)はWARNING以上
  if (hour >= 19) {
    return severity === 'critical' || severity === 'warning';
  }
  // 営業時間内は全て通知
  return true;
}

function sendNotification(event) {
  const hour = new Date().getHours();
  if (!shouldNotify(event.severity, hour)) {
    // 翌朝まとめて送信するキューに追加
    addToPendingQueue(event);
    return;
  }
  routeNotification(event);
}

通知テンプレートの管理

テンプレートファイルの構成

workspace/
  templates/
    notifications/
      daily-report.md      # 日次レポート
      weekly-summary.md    # 週次サマリー
      alert-critical.md    # 緊急アラート
      deploy-success.md    # デプロイ成功
      deploy-failure.md    # デプロイ失敗

テンプレート例

<!-- templates/notifications/daily-report.md -->
📊 **日次レポート** — {{date}}

**アクセス概要**
• PV: **{{pv}}** ({{pvChange}})
• UU: **{{uu}}** ({{uuChange}})
• 平均滞在: {{avgDuration}}

**人気記事TOP5**
{{#each topArticles}}
{{@index + 1}}. {{title}} — {{pv}} PV
{{/each}}

**流入元**
{{#each sources}}
• {{name}}: {{sessions}} ({{percentage}}%)
{{/each}}

{{#if alerts}}
⚠️ **注意事項**
{{#each alerts}}
• {{message}}
{{/each}}
{{/if}}

テンプレートの動的適用

async function sendDailyReport() {
  // GA4データ取得
  const data = await fetchGA4Data();

  // テンプレート読み込み
  const template = await readFile('templates/notifications/daily-report.md');

  // テンプレート変数を置換
  const rendered = template
    .replace('{{date}}', new Date().toLocaleDateString('ja-JP'))
    .replace('{{pv}}', data.pv.toLocaleString())
    .replace('{{pvChange}}', formatChange(data.pvChange))
    .replace('{{uu}}', data.uu.toLocaleString());

  // 複数チャネルに配信
  message({ action: "send", target: "#ses-base", message: rendered });
}

実践: SES現場での活用パターン

パターン1: プロジェクト進捗自動報告

// 毎日17:00にプロジェクト進捗を自動集計・報告
async function dailyProjectUpdate() {
  // GitHub Issues/PRの状態を集計
  const openIssues = await exec('gh issue list --state open --json number | jq length');
  const closedToday = await exec('gh issue list --state closed --json closedAt | jq "[.[] | select(.closedAt > \\"$(date -v-1d +%Y-%m-%d)\\")] | length"');
  const openPRs = await exec('gh pr list --state open --json number | jq length');

  message({
    action: "send",
    target: "#project-updates",
    message: [
      "📋 **プロジェクト進捗レポート**",
      "",
      `• オープンIssue: ${openIssues}件`,
      `• 本日クローズ: ${closedToday}件`,
      `• レビュー待ちPR: ${openPRs}件`,
    ].join('\n')
  });
}

パターン2: SLAモニタリング通知

// SLA違反の検知と通知
async function checkSLA() {
  const metrics = await fetchMetrics();

  if (metrics.responseTime > 3000) {  // 3秒超
    message({
      action: "send",
      target: "#sla-alerts",
      message: `⚠️ SLA違反リスク: レスポンスタイム ${metrics.responseTime}ms (閾値: 3000ms)`
    });
  }

  if (metrics.availability < 99.9) {
    message({
      action: "send",
      target: "#sla-alerts",
      message: `🔴 可用性SLA違反: ${metrics.availability}% (目標: 99.9%)`
    });
  }
}

パターン3: コスト最適化アラート

// クラウドコストの急増検知
async function checkCostAnomaly() {
  const todayCost = await fetchTodayCost();
  const avgCost = await fetchAverageDailyCost(30);  // 30日平均

  if (todayCost > avgCost * 1.5) {  // 50%超過
    message({
      action: "send",
      target: "#cost-alerts",
      message: [
        "💸 **コスト異常検知**",
        "",
        `本日のコスト: ¥${todayCost.toLocaleString()}`,
        `30日平均: ¥${avgCost.toLocaleString()}`,
        `超過率: +${Math.round((todayCost / avgCost - 1) * 100)}%`,
        "",
        "👉 コスト詳細を確認してください"
      ].join('\n')
    });
  }
}

よくある質問

Q: 通知が多すぎて見逃しが発生しない?

通知疲れを防ぐための対策:

  • 重要度フィルタリングで不要な通知を抑制
  • バッチ配信で低優先度の通知をまとめる
  • 時間帯制御で深夜の非緊急通知を翌朝に
  • ダイジェスト機能で1日の通知をサマリー化

Q: OpenClawの通知とSlackBotの違いは?

比較項目OpenClaw通知SlackBot単体
AI処理通知内容をAIが生成固定テンプレート
マルチチャネルSlack + Discord + メールSlackのみ
条件分岐AI判断による動的ルーティングルールベース
コストOpenClaw利用料に含むSlack API無料枠

Q: 通知パイプラインのスキルは案件に活かせる?

通知・監視の自動化スキルは以下の案件で需要があります:

  • SRE/DevOps案件: 月額70〜95万円
  • 監視基盤構築: 月額65〜85万円
  • ChatOps導入: 月額60〜80万円

まとめ

OpenClawの通知パイプラインを活用すれば、監視・レポート・アラートの自動配信を一元管理できます。

この記事のまとめ
  • Slack・Discord・メールへの一元通知配信が可能
  • 条件分岐とフィルタリングで賢い通知ルーティング
  • エスカレーション設計で重要アラートの見逃し防止
  • cronジョブ連携で定期レポートを完全自動化
  • 通知テンプレートで品質と一貫性を維持

OpenClaw完全攻略シリーズの他の記事も合わせてご覧ください:

SES案件をお探しですか?

SES記事をもっと読む →
🏗️

SES BASE 編集長

SES業界歴10年以上のメンバーが在籍する編集チーム。SES企業での営業・エンジニア経験、フリーランス独立経験を持つメンバーが、業界のリアルな情報をお届けします。

📊 業界データに基づく記事制作 🔍 IPA・経済産業省データ参照 💼 SES実務経験者が執筆・監修