【Firebase】Firestoreのトリガーを利用しSlack通知する
Firestoreを利用し、お問い合わせ内容をSlackに通知する
2023年01月16日
関連記事
前提
- Firebaseの有料プランに登録している
- Functionsの利用環境が整っている
Functionsの利用環境はこちらで説明しています。
Slack側の設定
Slackアプリケーションを作成します。
- こちらから、「Create New App」ボタンを押下
- sign in to your Slack accountからSlackの認証を済ませる
- アプリ名(後から変更可能)、ワークスペースを選択し、「Create App」ボタンを押下
- 作成したアプリを選択
- 左のメニューから「Incoming Webhooks」を選択
- Activate Incoming Webhooks の右側にあるスイッチを有効にする
- 「Add New Webhook to Workspace」ボタンを押下
- チャンネルを選択する画面が開くので、通知を飛ばしたいチャンネルを選択し「Allow」ボタンを押下
- Webhook URLが作成されるので、POSTリクエストをしてみます。
例) curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services//XXX/YYY/ZZZ
実装
Slack側で設定した Webhook URL を控えておき、SLACK_WEB_HOOK_URL
という環境変数に入れておきます。
https://hooks.slack.com/services//XXX/YYY/ZZZ
パッケージの追加
SlackのAPIクライアントをパッケージに追加
app/functions
$ npm i @slack/webhook
仕組み
今回の実装はお問い合わせ内容をSlackに通知するというものです。
なので、Firestoreにはcontactsコレクション
が存在していることとします。
- お問合せが入る(contactsコレクションにドキュメントが追加されていく)
- contactsコレクションへのドキュメント追加をトリガーに関数(slackNotification)が実行される
hook.send({ text: message })
によりSlackに通知
index.ts
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
require('dotenv').config();
const privateKey = process.env.FB_PRIVATE_KEY || ''
const { IncomingWebhook } = require('@slack/webhook');
const hook = new IncomingWebhook(process.env.SLACK_WEB_HOOK_URL);
const cert = {
projectId: process.env.FB_PROJECT_ID,
clientEmail: process.env.FB_CLIENT_EMAIL,
privateKey: privateKey.replace(/\\n/g, "\n"),
};
admin.initializeApp({
credential: admin.credential.cert(cert)
});
exports.slackNotification = functions
.firestore
.document(`contacts/{contactId}`)
.onCreate(async (snapshot, _) => {
const contactData = snapshot.data()
const message = contactData.msg # msgフィールドにはお問い合わせ内容が入っている
await hook.send({
text: message
})
})