AWS EC2 Cron Job으로 Firebase에 데이터 추가하기

2024. 6. 14. 18:52AWS

사용 목적

특정 주기마다 DB에 자동으로 공지사항을 추가해주면, 앱에서 공지사항이 추가될 때마다 Notification을 발생시키는 작업을 하고 있다. 이번 포스팅에서는 AWS EC2 서버에서 Cron Job을 통해 주기적으로 Firebase Realtime Database에 공지사항 데이터를 추가하는 방법을 정리할 것이다.

실행 환경 & 모듈 설치

  • AWS EC2 Node.js 설치는 맨 아래 참고 사이트와 동일하게 진행하였다.
$ sudo apt update
$ sudo apt install nodejs
$ sudo apt install npm
$ nodejs -v
$ curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
$ sudo bash nodesource_setup.sh
$ sudo apt install nodejs
  • AWS EC2에 Node.js 코드를 작성하고, cron job을 실행했다.
  • npm이 설치된 상태에서 'npm install firebase-admin' 커맨드로 Firebase 관련 모듈을 설치해야 한다.
  • 'npm install moment-timezone' 커맨드로 moment-timezone 모듈을 설치해야 한다.

Firebase DB와 연동되는 Node.js 코드 작성

아래 코드의 주요 기능은 다음과 같다.

  • Firebase-admin 모듈, Firebase 서비스 계정 json 파일, DatabaseURL을 사용하여, Firebase Realtime Database와 연동한다.
  • Snapshot으로 현재 DB에 저장된 값을 읽어서, 마지막으로 저장된 공지사항 번호의 다음 번호부터 생성한다.
  • 새로운 공지사항을 DB에 Insert 하며, 공지사항 등록 날짜는 'Asia/Seoul' 시간을 가공하여 사용하였다.
const admin = require('firebase-admin');
const serviceAccount = require('./ku-club-management-firebase-adminsdk-ddg50-ce3372e1ca.json');
var moment = require('moment-timezone');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: '{Firebase Realtime Database 주소를 입력하시오}'
});

const db = admin.database();
const noticeRef = db.ref('/KuclubDB/Notice');
console.log(noticeRef)

async function addNotice() {
  const snapshot = await noticeRef.once('value');
  const notices = snapshot.val();
  let noticeNum = 1;

  var today = moment().tz('Asia/Seoul');
  var year = today.format('YYYY');
  var month = today.format('MM');
  var day = today.format('DD');
  var dateString = year + '-' + month + '-' + day;

 if (notices) {
    const noticeKeys = Object.keys(notices);
    const lastNoticeKey = noticeKeys[noticeKeys.length - 1];
    const lastNotice = notices[lastNoticeKey];
    noticeNum = lastNotice.noticeNum + 1;
  }

  const newNotice = {
    noticeContent: "This is a scheduled notice content.",
    noticeDt: dateString,
    noticeNum: noticeNum,
    noticeTitle: "Scheduled Notice Title",
    clubName: "ClubName" + noticeNum
  };

  await noticeRef.child(noticeNum.toString()).set(newNotice);

  console.log('New notice added with number:', noticeNum);
}

addNotice().catch(console.error);
  • Node.js 코드의 databaseURL 에는 아래 사진에 있는 주소를 넣으면 된다.

터미널에서 Cron job 실행

  • Crontab 설정 진입
crontab -e
  • 진입한 파일에 설정 추가 및 저장
    • 아래 설정은 30분마다 noticeCronJob.js를 실행시켜 공지사항 1개를 DB에 Insert 하도록 한다.
    • 실행할 파일 경로를 정확히 적도록 주의한다.
*/1 * * * * /usr/bin/node /home/ubuntu/cronJob/noticeCronJob.js
  • Cron job이 잘 실행되지 않을 경우, 프롬프트에 아래 커맨드를 입력해서 에러를 확인한다.
/usr/bin/node /home/ubuntu/cronJob/noticeCronJob.js

실행결과

Firebase Realtime Database에 Cron Job을 통해 주기적이고, 자동으로 공지사항이 추가되는 것을 확인하였다.

 

 

* 참고 사이트

(AWS ec2 인스턴스에 Node.js Express서버 올리기)

https://wonjunjang.medium.com/aws-ec2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%97%90-node-js-express%EC%84%9C%EB%B2%84-%EC%98%AC%EB%A6%AC%EA%B8%B0-bb3b77ae4b73