本記事でやること
Google Cloud Pub/Sub
から Google Cloud Functions
をトリガーしてみます。
背景
諸事情により Google Cloud Functions を定期実行してみたいと思い調べてみると、この辺りの記事が引っかかりました。
- Firebase Cloud Functionsで定期実行してみる - Qiita
- Google の Cloud Functions で、定期実行する方法を検討・採用する。 - コワーキングスペース タネマキ
- Google Developers Japan: Cloud Functions for Firebase でジョブをスケジューリング(cron)する
なるほど。大きく分けると以下の2パターンがありそう。
- GCP 内で完結する方法
- App Engine Cron, Cloud Pub/Sub を使う
- 外部サービスを使って定期実行してあげる方法
- HTTP 関数を定期的に叩く
2番目の方法だと、一見簡単そうですが、そのままだと URL さえ知っていれば誰でも叩けることになり、認証の仕組みを入れようとすると面倒臭そうな印象。(参考 : Cloud FunctionsでIAMを利用する - Studio Andy)
ということで、今回は1番目の GCP 内で完結する方法を採用してみようと思いました。
まずは App Engine Cron
は使わずに Google Cloud Pub/Sub
から Google Cloud Functions
をトリガーしてみることにしました。
追記: 今は Cloud Scheduler
があるので、定期実行に関しては、素直にそちらを使ってあげるのが良さそうです! => https://cloud.google.com/scheduler/
環境
- macOS High Sierra 10.13.6
$ gcloud --version
Google Cloud SDK 217.0.0
beta 2018.07.16
bq 2.0.34
core 2018.09.17
gsutil 4.34
Google Cloud Functions を動かしてみる
私は クイックスタート: gcloud コマンドライン ツールの使用 | Cloud Functions のドキュメント | Google Cloud を参考に Google Cloud Functions 単体で動かしてみました。既に Google Cloud Functions を動かしたことがある人は、飛ばして良いと思います。
region の設定
東京リージョンに設定します。
$ gcloud beta functions regions list # 利用できるリージョンの確認
$ gcloud config set functions/region asia-northeast1 # 東京リージョンに設定
$ gcloud config list
[core]
account = xxx@xxx.xxx
disable_usage_reporting = False
project = xxx
[functions]
region = asia-northeast1
Google Cloud Functions を Google Cloud Pub/Sub からトリガーしてみる
ようやく本題です。
バックグラウンド関数 | Cloud Functions のドキュメント | Google Cloud を参考に進めていきます。
Cloud Pub/Sub の例
を参考に、以下のようにしてみました。
exports.helloPubSub = (event, callback) => {
const pubsubData = event.data;
console.log(pubsubData.message);
callback();
};
Google Cloud Pub/Sub トリガー | Cloud Functions のドキュメント | Google Cloud を参考にデプロイする。
$ gcloud beta functions deploy helloPubSub --trigger-resource hello_world --trigger-event google.pubsub.topic.publish
ちなみに
から、Pub/Sub と Functions が作成されていることを確認できる。
動作確認
$ gcloud beta functions call helloPubSub --data '{"message":"Hello, GCF!!"}'
https://console.cloud.google.com/logs からログに Hello, GCF!!
が出力されていることを確認できました。