前提
- 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
    })
  })