Cloud Functionsを定期実行させてみる

Cloud Functionsを定期実行させてみる

Clock Icon2020.07.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Cloud FunctionsはGoogle CloudのFaaS(Function as a Service)です。 Google Cloudの勉強のためにある処理をCloud Functionsを使って実装してみようと思った際に、関数を定期実行させる方法が分からなかったので、調べて試してみました。

概要

Cloud SchedulerとCloud Pub/Subを利用することでCloud Functionsを定期実行することが可能です。

Cloud Schedulerジョブで設定されたスケジュールに応じてPub/Subのトピックにメッセージが発行されます。トピックのサブスクライバーとしてCloud Functionsの関数を設定することで、メッセージの通知をトリガーとして関数を実行できます。

注意点としては、Pub/Subのトピックでのメッセージ配信もCloud Functionsのイベントベースでの実行も保証されている配信/実行回数は最低1回なので、Cloud Functionsで実行する処理は冪等性を満たす必要があります。

今回は扱いませんが、Cloud Functions for Firebaseでは関数コード内にスケジュール設定を書くことで定期実行が可能で、Cloud SchedulerジョブやCloud Pub/Subトピックは自動作成されるようです。

やってみる

Cloud Schedulerジョブから送られてくるメッセージのペイロードを表示するだけのPythonの関数を定期実行させてみます。

Cloud Functionsで関数を作成する

まずはCloud Functionsで関数を作成します。

関数名やリージョン、トリガーを設定します。

Pub/Subのトピックを作成し、トリガーとして利用します。トリガー設定時に再試行オプションを設定可能ですが、今回は設定しません。

再試行を設定した場合は、関数の実行失敗時、最大7日間に渡り関数が再実行されます。再実行によって回復するエラーであれば問題ないですが、アプリケーションのバグが混入している場合などは再実行してもひたすら失敗し続け、余分な費用が発生するなど不利益を被る可能性があります。再試行を設定する場合は、ドキュメントに記載されているベストプラクティスを確認しておくのが良さそうです。

そのほかの設定についても今回はすべてデフォルトのものを利用するため、そのまま次に進めます。

ランタイムはPython 3.7を利用し、処理内容はトピックから送られてくるデータの中身をprintするデフォルトの処理を使います。

デプロイをクリックすることで、関数が作成/デプロイされます。

Cloud Schedulerでジョブを作成する

続いて、定期実行の要であるCloud Schedulerのジョブを作成します。

Cloud Schedulerを利用するためには、App Engineアプリケーションがプロジェクト内で作成してある必要があります。Cloud Schedulerの画面を開いてエラーが出る場合には、App Engineのアプリケーションを作成してみてください。

Cloud Schedulerではcron形式で実行タイミングを設定できます。今回は月曜から金曜までの9時から19時までの毎分で設定してみます。また、タイムゾーンはJSTを選択し、配信先には先ほど作成したトピック名を入力します。ペイロードにはtestを入力します。

作成が完了すると、ジョブが有効になっていることを確認できます。ジョブは有効状態になってるので、スケジュール通り毎分実行されるはずです。

これで一通り必要なものを準備できました。

関数が定期実行されていることを確認する

Cloud LoggingのログビューアーからCloud Schedulerジョブが実行されていることが確認できます。

また同様に、ログビューアーの対象リソースをCloud Functionsで作成した関数に設定することで、Cloud Schedulerで設定したペイロードが出力されていることが確認できます。

さいごに

Cloud SchedulerとPub/Subを用いたCloud Functionsの定期実行を試してみました。3種類のサービスを利用することから最初は複雑に思えましたが、細かく設定しない場合には簡単にリソースを作成&利用できそうです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.