[Firebase] firestore trigger + slack 메시징 자동화 적용기

tech-hoon·2022년 3월 17일
0
post-thumbnail

firestore에 특정 데이터가 등록될 시, slack으로 메시지가 전송되도록 자동화해보자

배경

기숙사생만 이용하는 커뮤니티 특성상, 기숙사생임을 인증하는 절차가 존재한다. 수많은 가입 인증 처리를 관리하기 위한 프로세스가 필요했다. 프로세스는 다음과 같다.

  1. 사용자가 회원가입 인증용 이미지(이름표 사진)를 업로드한다.
  2. 업로드한 이미지와 사용자 정보를 admin slack 계정으로 메시지를 보낸다.
  3. 관리자 slack으로 전송된 사용자의 이미지와 사용자 정보가 일치함을 확인 후 회원가입을 승인한다.

Slack Webhook

먼저 slack webhook을 등록하고, webhook url을 복사한다 (참고)

slack url이 외부로 노출되는 걸 방지하기 위해, firebase functions:config:set을 통해 firebase에 url을 등록한다.

firebase functions:config:set slack.url="https://hooks.slack.com/services/[YOUR_ID]"

@slack/client npm 패키지를 설치한다.

npm install @slack/client

설치한 패키지를 불러오고, SlackWebhook을 선언한다.

// functions/src/index.ts

import SlackWebhook = require('@slack/client');
const IncomingWebhook = SlackWebhook.IncomingWebhook;
const config = functions.config();
const slackUrl = config.slack.url;
const Slack = new IncomingWebhook(slackUrl);

			...

firestore-functions

users 컬렉션에 새로운 user 데이터가 생성될 때, firestore-functionsonCreate 내부에 있는 동작이 트리거된다. Slack.send를 통해 원하는 메시지를 전송하도록 하였다.

// functions/src/index.ts

		...

export const userCreated = functions
  .region('asia-northeast3')
  .firestore.document('users/{userId}')
  .onCreate((snapshot) => {
    const { email, name, resident_auth_image, uid } = snapshot.data();

    Slack.send({
      blocks: [
        {
          type: 'section',
          text: {
            type: 'mrkdwn',
            text: '새로운 사용자가 등록되었습니다.',
          },
        },
        {
          type: 'section',
          text: {
            type: 'mrkdwn',
            text: `*이름:*\n${name}\n*아이디:*\n${uid} ... 사진*:${resident_auth_image}\n`,
          },
							...
				}
			]
		});
});

터미널에 다음 코드를 실행하여, 작성한 코드를 firebase에 배포한다.

firebase deploy --only "functions:userCreated"

데모

firebase-slack

profile
제 삽질을 공유합니다.

0개의 댓글