본문 바로가기
관리자

Programming-[CrossPlatform]/Flutter

[제철음식 알리미] firebase function로 scheduler 만들기. 기초 학습하기

728x90
반응형

 

1. 배경

 

제철음식 알리미에서 푸시 알림을 주기적으로 전송하는 스케줄러를 적용하고 있었다. 내 macOS의 로컬 launchctl을 사용(https://whitepro.tistory.com/1018)하여 전송하고 있었는데, 로컬 컴퓨터에 부하를 줄 수도 있을 것 같았고 firebase functions를 적용해도 무료할당량이 월 호출 수 200만회까지는 무료라서 해당 앱에서는 비용이 들지 않을거라고 판단하여 공부해보고 적용하게 되었다.

 

 

python, vscode를 기반으로 하는 내용이다.

 

 

 

 

2. 세팅하기

functions에 나오는대로 로컬에 npm을 이용하여 전역으로 firebase-tools를 설치해주면 firebase CLI를 통해 functions에 관련한 여러 명령어들을 입력하고 제어할 수 있다.

 

$ npm install -g firebase-tools

 

그리고 내가 작업을 원하는 로컬 디렉토리로 이동하여 아래 명령어로 시작해주면 된다.

 

$ firebase init

 

 

functions를 작성할 언어를 선택하게 되어있다. javascript, typescript, python이 제공되는데 나는 python으로 선택했다. 그리고나면 functions와 관련한 파일들이 생성되는 것을 확인할 수 있다.

 

 

main.py, messages.py, test.py는 내가 직접 생성한 파일들이다. 여기서 신경써야할 부분들은 아래와 같다.

 

1. .json 파일

firestore database, storage, messaging 등 각 서비스에 필요한 인증용 파일이다. 이 파일을 통해 코드로써 내 프로젝트에 접근할 수 있는 service account임을 인증하게 된다.

 

프로젝트 설정 -> 서비스 계정에 들어가서 비공개키를 생성하면 json 파일을 얻을 수 있다. 이 파일을 functions 폴더에 넣어주고 활용한다.

 

 

그리고 google cloud console -> 내 프로젝트 -> IAM에 들어가보면 내가 생성한 서비스 계정의 정보와 권한 목록이 있는 것을 확인할 수 있다. 만약 작업을 하다가 권한 관련한 문제가 발생하면, 이 콘솔 페이지에서 권한을 추가해주면 된다. 특히, 내가 프로젝트의 소유자가 아니라면 권한 관련한 문제가 발생할 수 있는데, 이 페이지에서 관리한다는 것을 기억하고 처리하면 된다.

https://console.cloud.google.com/iam-admin/iam

 

 

 

2. venv

python에 국한된 문제이긴한데, 필요한 라이브러리들을 가상환경인 venv에 설치해주고 넣어준다. 이 과정은 원격 functions에 적용되지는 않는 내용이지만, 로컬에서 테스트 등을 해볼려면 필요한 과정이다. 그리고 실제 원격지의 functions 배포 전에, 필요한 패키지들이 정상적으로 설치되는지 점검해보는 단계이기도 하다. 실제 functions가 배포되면 functions/ 디렉토리 내부의 requirements.txt를 조회하여 필요한 패키지들을 설치해준다.

 

venv를 활성화하기 위해 아래 명령어를 입력한다.

$ source {프로젝트 루트 디렉토리}/functions/bin/activate

 

그럼 CLI의 명령어 입력줄 앞에 (venv)라는 부분이 보인다.

 

여기서 venv 내의 requirements.txt에 내가 필요한 라이브러리 목록들을 아래처럼 작성해주고, 아래 명령어를 통해 라이브러리들을 설치해준다.

 

$ pip install -r requirements.txt
# firebase_functions등 필요한 라이브러리들을 모두 설치

 

 

 

3. main.py

그리고 나서 아래처럼 functions에서 실행할 메서드를 작성해준다. 먼저 cred를 호출하는 부분에서 위에서 넣어준 .json 파일을 활용하여 인증하는 것을 확인할 수 있다.

 

그리고 send_message_mutli의 윗 부분에 @scheduler_fn.on_schedule이라는 데코레이터가 달린 것을 볼 수 있다. firebase functions는 이 부분을 인식하여 functions의 진입점으로 인식한다. 위에 작성한 부분은 UTC로 매주 수요일 23시에 해당 메서드가 실행되도록 하는 코드인데, 이렇게 scheduler와 같이 예약하는 것 외에도 http 요청을 날렸을 때 호출되는 등 다양한 functions 기능들이 있다.

 

데코레이터 설명 예시
@https_fn.on_request HTTP 요청을 처리하는 함수 정의 @https_fn.on_request()
@firestore_fn.on_document_created Firestore에서 문서가 생성될 때 트리거되는 함수 정의 @firestore_fn.on_document_created(document="collection/{docId}")
@firestore_fn.on_document_updated Firestore에서 문서가 업데이트될 때 트리거되는 함수 정의 @firestore_fn.on_document_updated(document="collection/{docId}")
@firestore_fn.on_document_deleted Firestore에서 문서가 삭제될 때 트리거되는 함수 정의 @firestore_fn.on_document_deleted(document="collection/{docId}")
@storage_fn.on_object_finalized Cloud Storage에 파일이 업로드(최종 저장)될 때 트리거되는 함수 정의 @storage_fn.on_object_finalized(bucket="your-bucket-name")
@storage_fn.on_object_deleted Cloud Storage에서 파일이 삭제될 때 트리거되는 함수 정의 @storage_fn.on_object_deleted(bucket="your-bucket-name")
@auth_fn.on_user_created Firebase Authentication에서 사용자가 생성될 때 트리거되는 함수 정의 @auth_fn.on_user_created()
@auth_fn.on_user_deleted Firebase Authentication에서 사용자가 삭제될 때 트리거되는 함수 정의 @auth_fn.on_user_deleted()
@pubsub_fn.on_message_published Pub/Sub 주제에 메시지가 게시될 때 트리거되는 함수 정의 @pubsub_fn.on_message_published(topic="your-topic-name")
@scheduler_fn.on_schedule 지정된 일정에 따라 주기적으로 실행되는 함수 정의 @scheduler_fn.on_schedule(schedule="every Thursday 08:00", time_zone="Asia/Seoul")

 

 

 

3. 배포 및 관리하기

 

마지막으로 배포만 하면 된다. 프로젝트의 루트 디렉토리에서 다음 명령어를 입력하면 된다.

 

$ firebase deploy

 

 

만약 성공적으로 배포된다면, firebase console에서 아래처럼 확인할 수 있다.

 

 

아래 명령어로도 확인할 수 있다. 이외에도 firebase- 로 시작하는 다양한 명령어가 있으니 알아보면 된다.

 

$ firebase functions:list

 

 

 

 

 

gcloud

firebase에 올라간 리소스들도 google cloud console에서 관리된다. 위 functions 같은 경우 아래 사이트에서 확인이 가능하다.

https://console.cloud.google.com/functions

 

 

그리고 gcloud CLI를 설치하면 firebase와 관련한 모든 리소스 정보 등을 cli로 간편하게 확인하고 관리할 수 있다.

 

$ brew install --cask google-cloud-sdk

 

$ gcloud init

 

 

 

728x90
반응형