본문 바로가기
Flutter로 1인 앱 개발 해보기

Firebase Functions scheduler 사용해보기

by 유티끌 2024. 10. 19.

얼마전에 파이어베이스의 functions에서 스케쥴러를 사용해야할 일이 생겼었다.

결과적으로는 Blaze 요금제 이상 요금제를 사용해야지 functions에 올렸을 때 정상적으로 동작한다는 것을 알았고, 나는 스케쥴링이 필요하긴 한데 요금제를 사용할 마음은 없어서 다른 방법으로 회피했다.

어쨌든 이번은 기록용으로 한 번 남겨본다.


전제 조건

서비스키

일단 functions 자체는 그냥 사용할 수 있는데, firestore에서 데이터를 가져온다던지 하는 작업을 하려면 서비스키로 인증을해야한다.

프로젝트 개요 옆 톱니바퀴 > 프로젝트 설정 > 서비스 계정 으로 이동해서 키 생성을 하고 파일을 다운받는다.

이후 소스코드에서 읽어주면 된다.

코드


import firebase_admin
from firebase_admin import credentials, messaging, firestore
from firebase_functions import scheduler_fn
import datetime

# Firebase 프로젝트 초기화
cred = credentials.Certificate(my_service_key.json")
firebase_admin.initialize_app(cred)

db = firestore.client()


@scheduler_fn.on_schedule(schedule="0 5 * * *", timezone=scheduler_fn.Timezone("Asia/Seoul"))
def send_daily_notification(event, context):
    # 현재 날짜 가져오기
    now = datetime.datetime.now()

    # Firestore에서 모든 사용자의 FCM 토큰 가져오기
    users_ref = db.collection('users')
    docs = users_ref.stream()

    tokens = []
    for doc in docs:
        user_data = doc.to_dict()
        if 'fcm_token' in user_data:
            tokens.append(user_data['fcm_token'])

    if not tokens:
        print("No tokens found. Exiting.")
        return

    # 메시지 생성
    message = messaging.MulticastMessage(
        notification=messaging.Notification(
            title='테스트테스트',
            body='테스트테스트테스트',
        ),
        tokens=tokens,
    )

    # 메시지 전송
    messaging.send_each_for_multicast(message)

내 코드는 파이어스토어에 저장된 fcm_token을 대상으로 Cloud messeging을 이용해 푸시를 발송하는 코드다.
여기서 스케쥴링을 이용하려면
@scheduler_fn.on_schedule 데코레이터를 사용해야한다.

timezone 파라미터는, 실행해야하는 국가나 지역의 타임존을 설정해줘야한다. 그렇지 않으면 기본적으로는 functions 인스턴스가 위치해있는 지역 기준의 시간대로 스케쥴링이 실행되어버린다.


실행 결과 확인

실행결과는 functions의 로그를 통해 확인할 수 있다.

로그창을 확인해서 검색해보니 내가 원하는 시간대에 functions가 실행되긴 했지만 실패했다.

위에서도 말했지만 현재는 무료 티어라서 실행실패가 된 것 같다.

반응형

댓글