Contents
Slack App の新規作成
手順概要
| 手順 | 操作内容 |
|---|---|
| 1 | ワークスペース管理画面(Settings & administration → Manage apps)へ遷移 |
| 2 | 左ペインの Apps → Create New App をクリック |
| 3 | 「From scratch」か「From an app manifest」を選択し、アプリ名・開発用ワークスペースを入力 |
| 4 | 作成後に表示される OAuth & Permissions タブで Bot Token Scopes に chat:write と incoming-webhook を追加 |
必要な権限
chat:write… アプリがメッセージを送信できるようにする基本スコープincoming-webhook… Incoming Webhook のエンドポイント生成を許可
参考:Slack 公式ドキュメント「Create a Slack app」および「OAuth & Permissions」
スクリーンショット例
| 画面 | 説明 |
|---|---|
![]() |
「Create New App」ボタンが左ペイン上部に配置されています。 |
![]() |
Bot Token Scopes に必要なスコープを追加します。 |
Incoming Webhook の有効化とチャンネル設定
- 作成したアプリの Features → Incoming Webhooks を開く
- トグルスイッチを On にすると「Add New Webhook to Workspace」ボタンが表示されます
- ボタンをクリックし、メッセージ送信先チャンネル(例:
#alerts)を選択 → Allow - 画面下部に生成された Webhook URL が表示されます
参考:Slack Developers Docs 「Incoming Webhooks」
スクリーンショット例
| 画面 | 説明 |
|---|---|
![]() |
URL が生成された状態です。 |
Webhook URL のテスト送信(curl / Postman)
1. curl を使ったシンプルテスト
|
1 2 3 4 |
curl -X POST -H "Content-Type: application/json" \ -d '{"text":"🚀 Slack Incoming Webhook のテストです"}' \ https://hooks.slack.com/services/XXXXXXXX/YYYYYYYY/ZZZZZZZZ |
- 正常に送信できると、レスポンスは
ok(ステータス 200)になります。
2. Postman での手順
| 手順 | 操作 |
|---|---|
| A | New Request → メソッド POST、URL に取得した Webhook URL を貼り付け |
| B | Headers タブで Content-Type: application/json を追加 |
| C | Body タブ → raw → JSON を選択し、以下を入力 |
|
1 2 3 4 |
{ "text": "*テスト*: Postman から送信しました" } |
| D | Send ボタンでリクエスト送信。ステータス 200 OK とレスポンス本文 ok が返れば成功です。 |
参考:Qiita 記事「Slack Incoming Webhook のテスト方法(curl・Postman)」
Block Kit でリッチメッセージを作成する方法
Block Kit Builder の利用手順
- ブラウザで https://app.slack.com/block-kit-builder にアクセス(ログインが必要)
- 右側の Add block ボタンから
section,context,actionsなど好きなブロックを選択 - 各ブロックは左ペインでプロパティを編集、右ペインにリアルタイムプレビューが表示されます
実装例(JSON)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*システム通知*\n以下の内容をご確認ください。" } }, { "type": "context", "elements": [{ "type": "plain_text", "text": "発生日時: 2024-04-19 10:23 JST" }] }, { "type": "actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "詳細を見る" }, "value": "detail_001" } ] } ] } |
上記 JSON を Webhook のペイロードに組み込めば、リッチなレイアウトの通知が実現できます。
マルチラインテキストのエスケープ
\nがそのままだと JSON パーサで失われるケースがあります。- 二重エスケープ(
\\n)を使用すると、最終的に改行として表示されます。 - コードやログを整形したい場合は preformatted block(バッククオート 3 つで囲む)と組み合わせるのが安全です。
エスケープ例
|
1 2 3 4 5 6 7 8 |
{ "type": "section", "text": { "type": "mrkdwn", "text": "*エラーログ*\n```\nError: File not found\\nPath: /var/log/app.log\n```" } } |
参考:Slack API Docs 「Block Kit Builder の使い方」
Workflow の外部トリガー型 Webhook と安全対策
外部トリガー Webhook の作成手順
| 手順 | 操作 |
|---|---|
| 1 | ワークスペース左メニューから Workflow Builder を開く |
| 2 | Create → 名前を入力し Next |
| 3 | トリガー選択画面で Webhook (外部トリガー) を選択 |
| 4 | 必要な変数(例: {{user}}, {{text}})を定義し、ステップに追加 |
| 5 | ワークフロー保存 → Copy Webhook URL ボタンでエンドポイント取得 |
取得した URL に対して HTTP POST を送るだけで、設定済みのワークフローが即座に実行されます。
セキュリティベストプラクティス
| 項目 | 実装例 |
|---|---|
| URL 管理 | 環境変数(.env)やシークレットマネージャーに保存し、コード上にハードコーディングしない |
| IP 制限 | 受信側サーバーで自社 IP アドレスまたは許可された CI/CD ランナーの IP のみ許可する(ファイアウォールやクラウドのセキュリティグループ) |
| 署名検証 | Slack が送る X‑Slack‑Signature と X‑Slack‑Request‑Timestamp を HMAC‑SHA256 で検証し、改ざん・リプレイ攻撃を防止 |
Node.js による署名検証サンプル
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const crypto = require('crypto'); /** * Slack リクエストの署名を検証するミドルウェア * @param {object} req Express のリクエストオブジェクト(rawBody 必須) * @returns {boolean} true → 正常、false → 不正 */ function verifySlackRequest(req) { const timestamp = req.headers['x-slack-request-timestamp']; const sigBaseString = `v0:${timestamp}:${req.rawBody}`; const mySignature = 'v0=' + crypto .createHmac('sha256', process.env.SLACK_SIGNING_SECRET) .update(sigBaseString, 'utf8') .digest('hex'); return crypto.timingSafeEqual( Buffer.from(mySignature), Buffer.from(req.headers['x-slack-signature']) ); } |
参考:Slack Docs 「Verifying requests from Slack」
エラーコード一覧と対処法(表)
| エラーコード | 主な原因 | 推奨対策 |
|---|---|---|
| 403 | 署名検証失敗、または IP 制限によりブロックされた | シークレットが正しいか再確認。サーバー側のファイアウォール設定を見直す |
| 404 | Webhook URL が削除・タイプミス | 管理コンソールで URL を再取得し、環境変数を更新 |
| payload_format_error | JSON 構造が不正(text や blocks が欠如) |
JSON Linter で構文チェック。必須フィールドを必ず含める |
| 429 (rate_limited) | 短時間に大量送信したためレートリミットに達した | エクスポネンシャルバックオフ実装し、1 分間の送信回数を抑制 |
まとめ
- Slack App の作成
- 管理コンソールから Create New App →
chat:write+incoming-webhookスコープ付与で完了 - Incoming Webhook の有効化
- Features > Incoming Webhooks をオンにし、投稿先チャンネルを指定すると URL が取得できる
- テスト送信
curlまたは Postman で{ "text": "…" }を POST →okが返れば成功- Block Kit によるリッチメッセージ
- Builder のリアルタイムプレビューを活用し、マルチラインは
\\nエスケープ+ preformatted ブロックで崩れ防止 - Workflow の外部トリガー Webhook
- Workflow Builder で URL を生成 → 署名検証・IP 制限・シークレット管理で安全に運用
- エラー対応
- 表にまとめた 403/404/payload_format_error/429 の原因と対策をすぐに実施
本手順を踏めば、現在の Slack UI に完全対応した Incoming Webhook を構築でき、社内通知や自動レポート、外部システムとの連携がスムーズに行えます。ぜひ実務で活用してください。


