GCP で処理を定期実行する方法

Google Cloud Platform

Google Cloud Platform (以下「 GCP 」)で特定の処理を定期的に実行する方法についてかんたんにまとめました。

GCP で処理を定期実行する方法の選択肢

GCP で処理を定期実行するための方法はいくつかあります。

  • A. Compute Engine インスタンスで cron を使う
  • B. Compute Engine インスタンスで処理を定期実行するスクリプトを走らせる
  • C. Cloud Scheduler と Pub/Sub と Cloud Functions を使う

A と B は、処理を実行するための Compute Engine インスタンスを立ち上げてそこで処理を実行する方法です。 一般的なアプローチなので、 GCP に慣れていない人でも導入しやすく、他のサービスに引っ越したくなったときの移行も比較的スムーズというメリットがあります。

C は GCP に固有の方法で、 GCP の 3 つのサービス↓を組み合わせる方法です。

  • Cloud Scheduler
  • Cloud Pub/Sub
  • Cloud Functions

A と B には特段特別なことはなく、単純にインスタンス(仮想マシン)を作ってそこで処理を実行するだけです。 今回は C についてのみ掘り下げて説明します。

Cloud Scheduler と Cloud Pub/Sub と Cloud Functions を使う

それぞれどんなサービスなのかをかんたんに説明します。

Cloud Scheduler とは

Cloud Scheduler は、いわば「 GCP 版 cron 」で、指定した時間に指定したジョブを実行できるサービスです。 記事執筆時点で 3 種類のジョブが選択可能です:

  • HTTP: WWW での HTTP リクエスト
  • Pub/Sub: Cloud Pub/Sub でのメッセージ送信
  • App Engine HTTP: App Engine インスタンスへの HTTP リクエスト

Cloud Scheduler でできることはこれだけなので、肝心の処理の中身は Pub/Sub で連携した先や App Engine インスタンス等で実装する必要があります。

Cloud Pub/Sub とは

Cloud Pub/Sub は、複数のサービス・アプリケーションを連携させるための非同期メッセージングサービスです。 「トピック」という単位で「誰(どのサービス)にメッセージを送るのか」を設定することができます。

Cloud Functions とは

Cloud Functions は、 GCP が提供する FaaS サービス( Functions as a Sarvice )のひとつで、指定したコード片を HTTP リクエストや Pub/Sub メッセージでトリガーできるサービスです。

Cloud Scheduler と Cloud Pub/Sub と Cloud Functions で処理を定期実行する

これら 3 つのサービスを組み合わせることで任意の処理を定期実行することができます。 実行のタイミングは Cloud Scheduler で、処理の中身は Cloud Functions で設定します。 Cloud Pub/Sub は Cloud Scheduler と Cloud Functions を仲介するだけです。

慣れないうちはどうしても行きつ戻りつが必要ですが、手戻りなしで一筆書きで実装するなら次の流れで進めることになります:

  1. Cloud Pub/Sub でトピックを作成する
  2. Cloud Functions でファンクションを作成し、 1 で作成した Pub/Sub トピックをトリガーに設定する
  3. Cloud Scheduler で Pub/Sub メッセージ送信のスケジュールを作成する

個人的には、 Cloud Scheduler から直接 Cloud Functions を起動できるとシンプル & かんたんでよさそうに思いますが、記事執筆時点ではそれはできないようになっています。 間に必ず Cloud Pub/Sub を挟む必要があります。

私は実装したことがないので詳しくはわかりませんが、 Cloud Functions のところを Cloud Run で実装する(= Cloud Run を Pub/Sub で起動する)ことも可能なようです。

Cloud Functions の作り方については、ここで説明してもすぐに古い情報になってしまうためここでは説明しません。 Google 公式のドキュメントとサンプルを参照してください:

ということで、 GCP で定期的に処理を実行する方法のかんたんなまとめでした。

GCP の API を利用したり複数のサービスを連携したりする必要があるなら選択肢 C の「 Cloud Scheduler + Pub/Sub + Cloud Functions 」の一択になりますが、選択肢 C はどうしても大がかりになるため、 1 つの Compute Engine インスタンスで完結するようなちょっとした処理の場合は A か B で凌ぐのがよさそうな気がします。

参考

関連記事


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら