【Firebase】Firestoreのトリガーを利用しSlack通知する

Firestoreを利用し、お問い合わせ内容をSlackに通知する

2023年01月16日
関連記事

前提

  • Firebaseの有料プランに登録している
  • Functionsの利用環境が整っている

Functionsの利用環境はこちらで説明しています。

Slack側の設定

Slackアプリケーションを作成します。

  1. こちらから、「Create New App」ボタンを押下
  2. sign in to your Slack accountからSlackの認証を済ませる
  3. アプリ名(後から変更可能)、ワークスペースを選択し、「Create App」ボタンを押下
  4. 作成したアプリを選択
  5. 左のメニューから「Incoming Webhooks」を選択
  6. Activate Incoming Webhooks の右側にあるスイッチを有効にする
  7. 「Add New Webhook to Workspace」ボタンを押下
  8. チャンネルを選択する画面が開くので、通知を飛ばしたいチャンネルを選択し「Allow」ボタンを押下
  9. 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コレクションが存在していることとします。

  1. お問合せが入る(contactsコレクションにドキュメントが追加されていく)
  2. contactsコレクションへのドキュメント追加をトリガーに関数(slackNotification)が実行される
  3. 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
    })
  })
筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。