얼마전에 파이어베이스의 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가 실행되긴 했지만 실패했다.
위에서도 말했지만 현재는 무료 티어라서 실행실패가 된 것 같다.
반응형
'Flutter로 1인 앱 개발 해보기' 카테고리의 다른 글
OpenAI API - Structured output 사용 시 json 파싱 제대로 안될 때. (0) | 2024.10.06 |
---|---|
안드로이드 구글 플레이콘솔 본인인증 해보기 (3) | 2024.10.03 |
댓글