커스텀 이벤트 트리거 생성 및 처리

Cloud Functions(2세대)를 사용하면 커스텀 이벤트에 대한 응답으로 함수를 트리거할 수 있습니다. Cloud Functions용 Firebase SDK에서 기본적으로 지원하는 Firebase 이벤트와는 달리, 특별 이벤트 또는 추가 이벤트 제공업체에서 제공하는 이벤트입니다. 앱은 커스텀 이벤트 트리거를 통해 Firebase Extensions에서 제공하는 이벤트에 응답하거나 자체 커스텀 이벤트를 게시하고 이에 대한 응답으로 함수를 트리거할 수 있습니다.

모든 커스텀 이벤트는 CloudEvents JSON 이벤트 형식을 따르며 Eventarc에 게시됩니다. Eventarc 사용료가 부과됩니다.

커스텀 이벤트로 함수 트리거

다음 기본 흐름을 구현하여 커스텀 이벤트를 게시하거나 Firebase Extensions에서 이벤트를 가져오고 이러한 이벤트에 대한 응답으로 함수를 트리거할 수 있습니다.

  1. 원하는 이벤트를 Eventarc 채널에 게시하거나 설치된 확장 프로그램에서 제공하는 사용 가능한 이벤트를 식별합니다.
  2. 함수 코드에서 onCustomEventPublished 핸들러를 사용하여 Eventarc 채널의 이벤트를 구독합니다.
  3. 함수에서 CloudEvent 객체에서 반환된 페이로드를 파싱하고 앱에 필요한 커스텀 로직을 수행합니다.

예를 들어 게임 앱에서는 상위 10개의 경쟁사 리더보드에 참여하거나 리더보드에서 나갈 때 사용자에게 알림을 전송하려고 할 수 있습니다. 이 앱은 기본 채널에 리더보드 이벤트를 게시한 후 타겟팅된 푸시 알림을 사용자에게 전송하는 함수에서 이벤트를 처리할 수 있습니다.

또 다른 예로 앱에서 큰 이미지를 처리하도록 설계된 확장 프로그램은 이미지 크기 조절 완료 시 이벤트를 내보낼 수 있습니다. 이 확장 프로그램이 설치된 앱은 크기가 조절된 버전의 이미지를 가리키도록 앱의 링크를 업데이트하여 완료 이벤트를 처리할 수 있습니다.

채널에 이벤트 게시

Eventarc 이벤트는 채널에 게시됩니다. 채널은 관련 이벤트를 그룹화하고 액세스 권한을 관리하는 방법입니다. 확장 프로그램을 설치하거나 커스텀 이벤트를 사용하는 함수를 배포하면 Firebase에서 us-central1 리전에 firebase라는 기본 채널을 자동으로 만듭니다. Firebase Admin SDK는 채널에 게시하기 위한 eventarc 하위 패키지를 제공합니다.

기본 채널을 사용하여 신뢰할 수 있는 서버(또는 다른 함수)에서 이벤트를 게시하려면 다음 안내를 따르세요.

import {getEventarc} from 'firebase-admin/eventarc';

getEventarc().channel().publish({
    type: 'achieved-leaderboard',
    subject: 'Welcome to the top 10',
    data: {
      message: 'You have achieved the nth position in our leaderboard!  To see . . .'
    }
});

Firebase는 기본 채널을 자동으로 만드는 것 외에도 이벤트 소스를 지정하는 EVENTARC_CLOUD_EVENT_SOURCE 환경 변수를 설정합니다. Firebase용 Cloud Functions 외부에 이벤트를 게시하는 경우 source 필드를 이벤트 페이로드에 명시적으로 추가해야 합니다.

onCustomEventPublished로 이벤트 처리

onCustomEventPublished 핸들러를 사용하여 확장 프로그램 이벤트를 포함한 모든 커스텀 이벤트를 처리할 수 있습니다. 먼저 Eventarc SDK에서 이 핸들러와 함께 커스텀 로직을 위한 Node.js용 Firebase Admin SDK와 오류 처리를 위한 logger SDK를 가져옵니다.

const {onCustomEventPublished} = require("firebase-functions/v2/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

함수 코드에서 예시 함수 onimageresized에 표시된 대로 이벤트 이름을 전달합니다.

exports.onimageresized = onCustomEventPublished(
    "firebase.extensions.storage-resize-images.v1.complete",
    (event) => {
      logger.info("Received image resize completed event", event);
      // For example, write resized image details into Firestore.
      return getFirestore()
          .collection("images")
          .doc(event.subject.replace("/", "_")) // original file path
          .set(event.data); // resized images paths and sizes
    });

특정 확장 프로그램마다 이벤트 객체에서 반환되는 페이로드는 애플리케이션 흐름에서 커스텀 로직을 수행하는 데 사용할 수 있는 데이터를 제공합니다. 이 경우 함수는 Admin SDK를 사용하여 크기가 조절된 이미지에 대한 메타데이터를 Cloud Firestore의 컬렉션에 복사하고 이벤트에서 제공하는 subject에서 파일 이름을 가져오며 이벤트에서 제공하는 data의 메타데이터를 저장합니다.

기본이 아닌 채널에서 이벤트 게시 및 처리

맞춤 채널은 특별한 권한이 필요하거나 기타 요구사항을 충족하고 모든 이벤트에 동일한 수준의 가시성과 액세스를 원하지 않는 경우에 유용할 수 있습니다. Google Cloud 콘솔을 사용하여 자체 채널을 만들 수 있습니다. 이벤트 게시 및 구독은 동일한 채널에서 수행해야 합니다.

기본 채널 이외의 채널에 커스텀 이벤트가 게시되는 경우 함수 코드에서 채널을 지정해야 합니다. 예를 들어 us-west1 위치의 기본 채널 이외의 채널에 게시된 이벤트를 처리하려면 다음과 같이 채널을 지정해야 합니다.

import { onCustomEventPublished } from "firebase-functions/v2/eventarc";

export const func = onCustomEventPublished(
    {
      eventType: "firebase.extensions.storage-resize-images.v1.complete",
      channel: "locations/us-west1/channels/firebase",
      region: "us-west1",
    },
    (event) => { ... });