開発・個人開発

Slack Incoming Webhookで通知を作る 個人開発のモニタリングに使う実装

Slack Incoming Webhookで通知を作る 個人開発のモニタリングに使う実装

この記事の要点

Slack Incoming Webhookを使うと、個人開発のサイトから問い合わせ受信・エラー検知・デプロイ完了などをSlackに通知できる。Webhookの設定から実装コードまで、10分で動かせる手順を解説する。

結論

Slack Incoming Webhookは、設定5分・コード10行で個人開発のサイトからSlackに通知を送れる仕組みだ。問い合わせ受信・エラー検知・デプロイ通知などのモニタリングに活用できる。Webhook URLは環境変数で管理し、コードに直接書かないことが唯一の注意点だ。

Incoming Webhookの設定

1. Slackアプリの追加

Slack APIのページ(api.slack.com/apps)にアクセスして「Create New App」→「From manifest」を選ぶか、Slackのアプリディレクトリで「Incoming Webhooks」を検索して追加する方法がある。

より簡単な方法:Slackワークスペースの設定 → アプリ → 「Incoming Webhooks」を検索して追加する。

2. Webhookを追加

「Incoming Webhooksを有効にする」をオンにして、「ワークスペースにWebhookを追加」を押す。通知を送りたいチャンネルを選択する。

3. Webhook URLのコピー

生成された Webhook URL(https://hooks.slack.com/services/T.../B.../...の形式)をコピーして保存する。このURLがあれば、HTTPSのPOSTリクエストを送るだけでSlackにメッセージが届く。

最もシンプルな実装

Webhook URLにJSONをPOSTするだけで通知が送れる。

cURL(テスト用)

curl -X POST https://hooks.slack.com/services/YOUR/WEBHOOK/URL \
  -H 'Content-Type: application/json' \
  -d '{"text": "テスト通知です"}'

これを実行すると、指定したSlackチャンネルに「テスト通知です」というメッセージが届く。

JavaScript(Fetch API)

async function sendSlackNotification(message) {
  const webhookUrl = process.env.SLACK_WEBHOOK_URL;
  
  await fetch(webhookUrl, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ text: message }),
  });
}

// 使い方
await sendSlackNotification('問い合わせが届きました。');

実際の活用パターン

パターン1:問い合わせフォームの受信通知

フォームが送信されたとき、内容をSlackに通知する。

async function notifyNewInquiry({ name, email, message }) {
  const text = [
    '📩 *新しいお問い合わせ*',
    `*氏名:* ${name}`,
    `*メール:* ${email}`,
    `*内容:*\n${message}`,
  ].join('\n');

  await fetch(process.env.SLACK_WEBHOOK_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ text }),
  });
}

パターン2:エラー発生時の通知

APIのエラーが発生したときに通知する。個人開発では24時間監視できないため、エラーが起きたらSlackで気づけると助かる。

async function notifyError(error, context) {
  const text = [
    '🚨 *エラーが発生しました*',
    `*コンテキスト:* ${context}`,
    `*エラー:* ${error.message}`,
    `*発生時刻:* ${new Date().toLocaleString('ja-JP')}`,
  ].join('\n');

  await fetch(process.env.SLACK_WEBHOOK_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ text }),
  });
}

// 使い方
try {
  await processData();
} catch (error) {
  await notifyError(error, 'processData()');
}

パターン3:Supabase Edge Functionsからの通知

Supabase Edge Functionsの中でSlack通知を送る場合、APIキーはSupabaseの環境変数(secrets)に設定する。

// supabase/functions/my-function/index.ts
const slackWebhookUrl = Deno.env.get('SLACK_WEBHOOK_URL');

await fetch(slackWebhookUrl, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ text: '処理が完了しました' }),
});

絵文字とフォーマットで見やすくする

Slackのメッセージは絵文字とMarkdown書式が使える。

const message = {
  text: '✅ *デプロイ完了*\n`main`ブランチが本番環境にデプロイされました',
};

Markdown記法:

  • *太字*:太字
  • `コード`:コード(インライン)
  • ```コードブロック```:コードブロック
  • >引用:引用

Block Kitでリッチな通知を作る(応用)

シンプルなtextより視覚的な通知が欲しい場合は、Block Kitを使う。

const body = {
  blocks: [
    {
      type: 'header',
      text: { type: 'plain_text', text: '📩 新しいお問い合わせ' },
    },
    {
      type: 'section',
      fields: [
        { type: 'mrkdwn', text: `*氏名:*\n${name}` },
        { type: 'mrkdwn', text: `*メール:*\n${email}` },
      ],
    },
    {
      type: 'section',
      text: { type: 'mrkdwn', text: `*内容:*\n${message}` },
    },
  ],
};

await fetch(process.env.SLACK_WEBHOOK_URL, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(body),
});

Block KitのUIはSlack公式の「Block Kit Builder」で視覚的に作成できる。

Webhook URLの安全な管理

Webhook URLはAPIキーと同様に機密情報として扱う。

  • コードにハードコードしない
  • GitHubにプッシュしない(.gitignore.envを含める)
  • Vercel環境変数・Supabase secretsとして設定する

漏洩した場合は、Slack側でWebhookを無効化して新しいURLを再生成する。

問い合わせフォームの全体実装は問い合わせフォームをSupabase+Resend+Slackで作るで、Resendのメール送信実装はResendでメール送信を実装するで解説している。

まとめ

Slack Incoming Webhookは、HTTPSのPOSTリクエストを送るだけでSlackにメッセージを届けられる最もシンプルな通知の仕組みだ。問い合わせ受信・エラー通知・デプロイ完了など、個人開発のモニタリングに使える用途は多い。Webhook URLを環境変数で管理することと、エラーハンドリングを入れておくことを忘れなければ、実装はシンプルで安定して動く。

よくある質問

Slack Incoming Webhookは無料で使えますか

はい、無料です。SlackのIncoming Webhooksアプリを追加するだけで使えます。送信できるメッセージ数に制限はありませんが、Slackのフリープランでは過去90日分のメッセージしか参照できません。

Webhook URLが漏洩するとどうなりますか

Webhook URLを知っている人なら誰でもそのSlackチャンネルにメッセージを送れてしまいます。URLはコードに直接書かず、環境変数として管理することを強く勧めます。漏洩した場合は、Slack側でWebhookを無効化して新しいURLを生成してください。

VercelのデプロイをSlackに通知できますか

できます。VercelにはSlack通知の公式インテグレーションがあり、デプロイ開始・成功・失敗をSlackに自動通知できます。Vercelダッシュボードのプロジェクト設定からSlackと連携する方法が最も簡単です。

Webhookでリッチなフォーマットの通知を送れますか

Slackのブロックキット(Block Kit)を使うと、ヘッダー・セクション・ボタン・画像を組み合わせたリッチなメッセージを送れます。ただし個人開発のモニタリング用途なら、シンプルなテキストメッセージで十分なことが多いです。