Firebase Functions 정기 실행

소개



Firebase Functions에서 정기 실행을 할 수 있다는 것을 알았으므로 이번에는 그것을 시도해 보겠습니다.

TL; DR.



시도한 소스 코드
(기존 프로젝트에서했기 때문에 최소 구성이 아님)

Firebase(+ GCP) 설정



프로젝트 만들기



UI로부터 포치포치 설정해 간다.
이름 결정할 정도이므로 바삭바삭하게 진행한다.
애널리틱스가 필요하지 않으므로 비활성화합니다.


프로젝트 작성이 끝나면 왼쪽 상단의 기어에서 Setting 화면을 엽니다.
정기 실행하는 경우 Google Cloud Platform(GCP)リソース ロケーション 를 설정할 필요가 있으므로,
원하는 위치를 선택합니다. (이번에는 asia-northeast1 (도쿄)로 둔다)

작성한 프로젝트가 무료 플랜(Spark)이었을 경우, 종량 과금제의 Blaze로 해 둔다.
(정기 실행에 필요)

GCP 설정


Cloud Scheduler APICloud Pub/Sub API 를 유효하게 할 필요가 있다.APIライブラリ 에서 활성화합니다.

Firebase CLI 설정


# firebaseにログイン
$ firebase login

# firebase functions 初期設定
$ firebase init functions
> 色々聞かれるので好みの設定をする
> .firebasercとfirebase.json、functionsディレクトリが作成されていればOK

배포할 폴더 변경



디폴트의 ​​설정에서는 작성된 functions 디렉토리에 있는 package.json 를 참조해 배치된다.
package.json 로 의존이라든지 해결하고 있는 것 같다.
※초기 설정이라면 functions/lib/index.js 가 배포처가 된다.

다만 이번에는 이미 있는 프로젝트를 배포하고 싶었기 때문에 그 편을 변경해 나간다.
(+계층이 1단 어긋나는 것도 배포를 위해서만 변경하는 것도 싫었기 때문에)

변경하려면 firebase.json"source": "." 를 추가하면 된다.
(이번에는 현재 디렉토리로 만들고 싶었기 때문에 .)
아울러 predeployfunctions 아래의 package.json 를 보도록 prefix가 붙어 있었기 때문에 지워 둔다.
{
  "functions": {
    "source": ".",
    "predeploy": "npm run build"
  }
}

정기적으로 실행하는 코드를 작성합니다.



공식 샘플 을 참고로 하면서 써 간다.
export const sampleJob = functions
  // regionはGCPリソース ロケーションと合わせる
  .region('asia-northeast1')
  // 時間設定。よくあるcronの書き方もできる
  .pubsub.schedule('every day 07:00')
  // 時間指定しているので、一応タイムゾーンを設定しておく
  .timeZone('Asia/Tokyo')
  .onRun(context => {
    // 処理
  }

webpack 설정



webpack에서 번들한 결과를 배포하고 싶었으므로 설정해 간다.
어쩌면 firebase에 대한 설정은별로 없을 것입니다.
const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  mode: 'production',
  entry: path.join(__dirname, '/app.ts'),
  target: 'node',
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: [
          {loader: 'ts-loader'},
          {loader: 'eslint-loader'}
        ],
        exclude: /node_modules/
      },
      {
        test: /\.node$/,
        use: 'node-loader'
      }
    ]
  },
  resolve: {
    extensions: ['.js', '.json', '.ts'],
    modules: [path.join(__dirname, 'src'), 'node_modules']
  },
  output: {
    // これを設定しないとうまくデプロイされなかった
    libraryTarget: 'this',
    path: path.join(__dirname, 'dist'),
    filename: 'app.js'
  },
  externals: [nodeExternals()]
};

환경 변수 설정



패스워드 등 코드에 쓰고 싶지 않은 것을 환경 변수로 설정해 간다.
공식 샘플 을 모방하여 진행한다.
# 環境変数にslackのwebhookURLを設定
$ firebase functions:config:set slack.url=https://hooks.slack.com/services/XXX

꺼내려면 다음과 같이 한다.
import { config } from 'firebase-functions';
const slackUrl = config().slack.url;

배포


firebase deploy —only functions 에서 OK.
다만, deploy complete! 라든가 말하면서 실패하는 일이 있으므로,
웹 콘솔을 확인하여 배포가 완료되었는지 확인하는 것이 좋습니다.

요약



Firebase Functions에서 정기 실행하는 방법을 정리했다.
지금까지 정기 실행하고 싶은 처리가 있을 때는 Lambda를 사용하고 있었지만, 향후는 firebase로 좋을 것 같다.
(개인적으로 GCP에 집계하고 싶을 뿐.)

참고 링크


  • 시작하기: 첫 번째 함수 작성 및 배포 | Firebase
  • 함수 스케줄 설정 | Firebase
  • 환경 구성 | Firebase
  • 좋은 웹페이지 즐겨찾기