第19章:Slack通知の準備(Webhook + Secret)🔔🗝️
この章は「Slackに投稿できる!」「しかもURL(秘密)をコードに書いてない!」までを一気に完成させます💪😆 次の第20章で Firestore更新→Slack通知 を完成させるための“下ごしらえ”だよ〜🍳✨
この章のゴール 🎯
- Slackの Incoming Webhook URL を作れる🔗
- そのURLを Secret(Secret Manager) に安全に入れられる🗝️
- Functions(2nd gen)から Secret を読み出して、Slackに テスト投稿 できる📩✨
- Gitに秘密が混ざらない 習慣がつく🧯✅
1) まず理解:Incoming Webhooksって何?🤔

Slackの Incoming Webhooks は、「専用URLにJSONをPOSTすると、そのまま指定チャンネルへ投稿できる仕組み」だよ📮 メッセージ本文だけじゃなく、レイアウト(Blocks)も使えるので、通知を見やすくできる✨ (Slack開発者ドキュメント)
⚠️ ただし!このWebhook URLは “投稿できる権利そのもの” なので、漏れたらアウトです😱 だから Secretに入れて守る のがこの章の主役🗝️🔥
2) Slack側:Webhook URL を作る手順 🧩

4) Functions側:Secretを「関数に紐づけて」使う 🔗

8) AI活用:Gemini CLI / Antigravityで爆速にする 🤖🛸

9) ミニ課題(この章のゴール確認)📝🏁

10) チェックリスト ✅✅✅

やることはシンプル👇(Slack管理画面でポチポチ)
- Slackで アプリ(Slack App) を作る
- Incoming Webhooks を有効化(ON)
- Add New Webhook to Workspace
- 投稿先チャンネルを選んで許可 ✅
- できあがった Webhook URL をコピー(この時点では“誰にも見せない”)🔒
公式の説明はここが基準だよ📚 (Slack開発者ドキュメント)
💡 あるある
- 「ワークスペースでアプリ作成が禁止」→ 管理者に許可が必要なことがあるよ🙏
- 投稿チャンネルは最初は
#dev-notifyみたいに専用を作るのが安全でラク👍
3) Firebase側:Secret を作って、Webhook URL を入れる 🗝️
ここが最重要ポイント! Webhook URL をコードにも .env にも入れない。Secretに入れる🙂↕️
3-1. Secret を作成(Firebase CLI)🧰

プロジェクトのルートで👇(Secret名は例:SLACK_WEBHOOK_URL)
firebase functions:secrets:set SLACK_WEBHOOK_URL
入力を促されるので、SlackのWebhook URLを貼り付けてEnter🔐 このやり方が公式の基本手順だよ。 (Firebase)
Secret運用の大事な注意⚠️
- Secretの値を更新したら、そのSecretを使う関数は再デプロイが必要(反映されないことがある)🔁 (Firebase)
- 使ってるSecretを消すと、関数が静かに失敗することがある(地味に怖い)😇 (Firebase)
料金メモ(軽く知っておく)💸
Secret Managerは無料枠があるけど、アクセス回数などで課金が発生しうるよ〜という話が公式にある👌 (Firebase) (とはいえ、この教材レベルの通知でいきなり高額になるケースは稀!でも“意識”は大事🧠)
4) Functions側:Secretを「関数に紐づけて」使う 🔗
4-1. TypeScript:defineSecret + secrets オプション(2nd gen)🧱

2nd genの基本形はこれ👇
Secretを defineSecret() で宣言して、関数のオプション secrets: [...] で その関数にだけ渡す イメージだよ。 (Firebase)
例:HTTPでテスト送信する関数 slackTest を作る(最小でOK)✨
import { onRequest } from "firebase-functions/v2/https";
import { defineSecret } from "firebase-functions/params";
const SLACK_WEBHOOK_URL = defineSecret("SLACK_WEBHOOK_URL");
// ✅ テスト送信用(まずはここで動作確認)
export const slackTest = onRequest(
{ secrets: [SLACK_WEBHOOK_URL] },
async (req, res) => {
try {
const url = SLACK_WEBHOOK_URL.value(); // 👈 Secretの実体
// Node 20/22 なら fetch が標準で使えることが多いよ👍
const payload = {
text: "✅ Slack通知テスト:Functions から送信できたよ!🎉",
};
const r = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json; charset=utf-8" },
body: JSON.stringify(payload),
});
if (!r.ok) {
const body = await r.text();
res.status(500).send(`Slack error: ${r.status} ${body}`);
return;
}
res.status(200).send("ok");
} catch (e: any) {
res.status(500).send(e?.message ?? String(e));
}
}
);
✅ ここでのポイント
SLACK_WEBHOOK_URL.value()は 絶対にログに出さない(漏れたら終わり)😱secrets: [SLACK_WEBHOOK_URL]を付け忘れると、関数がSecretにアクセスできず詰むことがある🧱 (Firebase)
5) デプロイして、Slackに投稿テストする 🚀📩

5-1. デプロイ
firebase deploy --only functions:slackTest
デプロイ後、表示されたURLにアクセスすると、Slackにメッセージが飛ぶはず!🎯
5-2. Slack側で確認
指定チャンネルに👇みたいなのが出れば勝ち🏆
- ✅ Slack通知テスト:Functions から送信できたよ!🎉
6) ローカル検証(Emulator)で詰まったら 🧪😵💫

エミュレータは、既定だとSecretを取りに行こうとする(権限がなくて失敗することもある)という挙動が公式にあるよ。 (Firebase)
その場合は functions/.secret.local で ローカル用にSecretを上書きできる👌 (Firebase)
(この章では“まずクラウドでテスト送信成功”を優先でOK!ローカル最適化は第16章でガッツリやると気持ちいい🧠✨)
7) よくある事故と対策 🧯

事故A:Slackに何も出ない😇
- Webhook URLが間違ってる/古い
- Slack側でチャンネル許可を変えた
fetch()のレスポンスがokじゃない(このコードはエラー本文も返すので、そこを見る👀)
👉 Incoming Webhooksは「URLにJSONを送る」仕組みが前提。公式の送信仕様(payloadなど)も確認できるよ。 (Slack開発者ドキュメント)
事故B:Secret更新したのに反映されない😇
👉 Secret更新後は、そのSecretを使う関数を再デプロイが基本! (Firebase)
事故C:Gitに秘密が混ざった😱
.envに入れてコミットした- READMEに貼った
- スクショにURLが映った
👉 “Webhook URLはパスワード”と思って扱うのが正解🔒
8) AI活用:Gemini CLI / Antigravityで爆速にする 🤖🛸

ここ、ちゃんと“効く”やつだけ紹介するね👍
8-1. Gemini CLI の Firebase拡張:何が嬉しい?🧰
Firebase公式の Gemini CLI 拡張は、Firebase MCP server を自動セットアップして、
- Firebase開発向けの 定型プロンプト(slash commands)
- Firebaseプロジェクトに対して ツール実行(作成・デプロイ等の補助)
- Firebaseドキュメント参照をLLM向けに扱いやすくする みたいな機能を提供する、という説明が公式にあるよ。 (Firebase)
8-2. MCP server は Antigravity など色んな“エージェント環境”から使える🧩
Firebase MCP server は Antigravity や Gemini CLI、Firebase Studio など、MCPクライアントになれるツールから使えると明言されてる👌 (Firebase)
使い方のコツ(この章向け)💡
Geminiにこう頼むと強い👇
- 「2nd genのonRequestで、defineSecretを使ってSlack Incoming WebhooksにPOSTする最小コードを書いて」
- 「Secretを更新したら再デプロイが必要?どこに書いてある?」
- 「Slackのpayloadの最低限は?textだけでいい?」
AIに作らせて、公式ドキュメントと突き合わせてレビューすると最速で安全🧠✨
9) ミニ課題(この章のゴール確認)📝🏁

必須 ✅
slackTestをデプロイして、Slackに 1通 送る📩✨
余裕があれば 🌟
- payloadをちょい改造して、通知に「環境名」「時刻」を入れる⌛
- 「成功/失敗」を分けて、失敗時は
res.status(500)の本文を読みやすくする🧯
10) チェックリスト ✅✅✅

- Webhook URL を作れた(Slack側)🔗
-
firebase functions:secrets:set SLACK_WEBHOOK_URLでSecretに入れた🗝️ (Firebase) -
defineSecret()+secrets: [...]で関数に紐づけた🔗 (Firebase) - Slackにテスト投稿できた📩
- URLをログやコードに出してない🔒
ちょい寄り道:.NET / Python でやるなら?🧩
この教材はTS中心だけど、「別言語で関数を書く」話が出たときは Cloud Run functions(v2系) のランタイム表が基準になるよ。 (Google Cloud Documentation) たとえば .NET 8 を使う選択肢も“公式にサポート枠として存在”するので、C#でWebhook送信のHTTP関数を書くこと自体は現実的👍(ただしこの章はTSで統一して進めるのが学習効率◎) (Google Cloud Documentation)
次の第20章は、いよいよ Firestore更新 → Slack通知 を“実務っぽく壊れにくく”仕上げるよ🔥 (重複通知ガード、失敗時のリトライ、ログ設計あたりが主役になるはず🧠📣)