31
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Cloud Functions for Firebase の関数をスケジューラから定期的に呼び出す

Last updated at Posted at 2019-02-03

Firebase、、イイですね。。とくに Cloud Functions for Firebase とてもよいです。AWS Lambdaにくらべてシンプルですし。。

さて今回は、Firebaseに登録した関数を定期的に呼び出してみます。
FirebaseとGoogle Cloud Platform をさわれる環境を構築する で作った環境をつかって、Cloud Functions for Firebaseに登録した関数を、Cloud Scheduler ベータ版 というGCPのスケジューラから定期的に呼び出してみます。

--2019/09/21追記--
今日時点、もうスケジューラはベータ版ではなく正式版のようで、以下の記事から「ベータ」の記述を削除しました。コマンドのbetaをとったくらいで、基本は同じです。
--2019/09/21追記 以上--

Cloud Functions for Firebase を呼び出すには Cloud Functions for Firebase でジョブをスケジューリング(cron)する にある「App EngineのCron機能を使う」ってBest Practice?があるみたいなのですが、今回はCloud Scheduler ってのでやります。

具体的には「testTopic」というGCP上のTopicへのPublishに反応する関数を作成し、そこで実行したいロジックを呼び出します。そして、Cloud SchedulerからそのTopicへのPublishを定期的に行うことで、関数の定期実行を実現します。

環境

FirebaseとGoogle Cloud Platform をさわれる環境を構築する で環境を作るとこんな感じになってるとおもいます。

$ tree -a
.
├── .firebaserc
├── .gitignore
├── README.md
├── firebase.json
└── functions
    ├── .eslintrc.json
    ├── .gitignore
    ├── package.json
    ├── src
    │   └── index.ts
    └── tsconfig.json

もしくはGithubにコードをあげてあるので、そちらからコード取得してください。環境構築は以下の通り:

$ git clone --branch pub_sub_trigger https://github.com/masatomix/fb_function_samples.git
$ cd fb_function_samples/functions/
$ npm install
$ cd ../

やってみる

呼び出したい関数を作成してデプロイする

まずは実行したいロジックを作成します。

src/logic.ts
export function want_to_execute() {
  console.log('実行したいロジック!')
}

つづいて index.tsにPub/Subトリガーの関数を定義して、そこで上記ロジックを呼び出します。

src/index.ts
import * as functions from 'firebase-functions'

// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
//
// export const helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// });

import * as logic from './logic'

export const helloPubSub = functions.pubsub
  .topic('testTopic').onPublish(message => {
    logic.want_to_execute()
  })

いつものコマンドでFirebaseへ関数をデプロイします。

$ firebase deploy --only functions

✔  functions: functions folder uploaded successfully
i  functions: updating Node.js 8 function helloPubSub(us-central1)...
✔  functions[helloPubSub(us-central1)]: Successful update operation.

✔  Deploy complete!
Please note that it can take up to 30 seconds for your updated functions to propagate.

スケジューラを設定する

つづいてスケジューラにスケジュールを登録します。もちろん画面からも登録できるのですが、今回はコマンドラインからやってみましょう。。
あ、そのまえにgcloudコマンドが、Firebaseで使用しているのと同じプロジェクトに向いているかを確認します。

$ gcloud config list
[core]
account = xx@ki-no.org
disable_usage_reporting = False
project = xxxxx-xxxxxxx  '←ココとか'

Your active configuration is: [default]
$

向いてない場合は、Cloud SDK の初期化 などを参考に設定を行ってください。

gcloud scheduler jobs create pubsub を参考にコマンドを打ってみます。

$ gcloud scheduler jobs list
ID         LOCATION     SCHEDULE (TZ)           TARGET_TYPE  STATE
test       us-central1  * * * * * (Asia/Tokyo)  HTTP         ENABLED  <- 前に追加していたヤツ 
topicTest  us-central1  * * * * * (Asia/Tokyo)  Pub/Sub      ENABLED  <- 前に追加していたヤツ 
$


$ gcloud scheduler jobs create pubsub testJob \
  --topic testTopic \
  --message-body='test' \
  --schedule '* * * * *' \
  --time-zone='Asia/Tokyo'

name: projects/xxxxx-xxxxxxx/locations/us-central1/jobs/testJob
pubsubTarget:
  data: dGVzdA==
  topicName: projects/xxxxx-xxxxxxx/topics/testTopic
retryConfig:
  maxBackoffDuration: 3600s
  maxDoublings: 16
  maxRetryDuration: 0s
  minBackoffDuration: 5s
schedule: '* * * * *'
state: ENABLED
timeZone: Asia/Tokyo
userUpdateTime: '2019-02-03T15:55:14Z'


$ gcloud scheduler jobs list
ID         LOCATION     SCHEDULE (TZ)           TARGET_TYPE  STATE
test       us-central1  * * * * * (Asia/Tokyo)  HTTP         ENABLED
topicTest  us-central1  * * * * * (Asia/Tokyo)  Pub/Sub      ENABLED
testJob    us-central1  * * * * * (Asia/Tokyo)  Pub/Sub      ENABLED ←追加された!
$

おおお、追加されたようですね。Scheduleは「* * * * *」で登録したので、1分おきにPublishが行われるはずです。

ちなみに message-body はカラだと怒られたので、適当に値を入れてます。
また、デプロイされた関数がListenしているTopic「testTopic」は、関数をデプロイしたときに自動で作成されるようです。

画面でも登録を確認してみましょう。
https://console.cloud.google.com/cloudscheduler にアクセスしてみると、、、
image.png

確かに追加されてますね。よさそうです。

さて、最後にちゃんと定期的に実行されているか、関数のコンソールログを見てみましょう。
GCPの画面のメニューから、Cloud Functionsを選択 。
image.png

関数の一覧が表示されるので「helloPubSub」をクリック。
image.png

次の画面の右上に「ログの表示」とあるのでクリックすると、、、、
image.png

たしかに1分ごとに関数が呼び出されているようですね!!

まとめ

はじめFirebase Functionsのトリガーに「時間トリガー」がなかったので、定期実行できないじゃん、っておもったのですが、Cloud Schedulerという機能が追加されたので、コレをつかえば問題なさそうです。

おつかれさまでした。

関連リンク

31
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?