Cloudtasker
Cloud Run はリクエストに応答する形でしかインスタンスが立ち上がらないため、いわゆるジョブキューをウォッチして実行するようなジョブサーバとして使うことはできない
ちなみにタイムアウトが存在して最長でも 60 分なので長時間の処理を行うというのも不可
Cloud Run レイヤでタイムアウトによりフロントにレスポンスが返ったとしてもコンテナインスタンス中で実行されている処理は引き続き実行されはするのだが、リクエストが無いとインスタンスが停止されうるので、タイムアウト後も処理を実行されることを期待した実装は望ましくない
そこでジョブ的な処理を受け付けるエンドポイントを設けた上で Cloud Run に向けてリクエストするというのが Cloud Run 利用時のジョブを扱う上で度々見かけるアプローチ
リクエストには Cloud Tasks 等を使用する
アプリケーションはジョブを enqueue したいタイミングで Cloud Tasks にリクエストを投げ、Cloud Tasks が Cloud Run にリクエストする形
Cloudtasker は Rails におけるその用途のライブラリで、まさに上記のような仕組みを実現する
ローカルでは Redis を使いつつ同等の表現を行えるというのが良い
cron 的なスケジューリングはできず、したければ本番でも Redis を使う必要がある
Redis を設けたり保守するのが(しないに越したことはないという意味で)面倒なので Cloud Scheduler で 10 分おきにリクエストを行い、その controller にて、所定のタイミングであれば Cloudtasker に enqueue するといった形がお手軽でよいと感じた
この方針であれば単一の Cloud Scheduler で任意の cron タスクも対応できること、アプリケーションコード中に定期実行の定義が集約されること等の運用のお手軽さ・定義の明瞭さがあってよいと感じる
しかしまあ、タイムアウトを気にして長い処理を使えないというのは、どこかで困ることもありそうではある
長時間の実行を分割せずに実行するのであれば、GCP では Cloud Build を使うこととなる?
余談だが Cloud Run は${projectId}-compute@developer.gserviceaccount.com のサービスアカウントが使われるはずで、それに対して「クラウドタスクへのデータ追加」「クラウドタスク閲覧者」を付与する必要がある
このサービスアカウントのもとでの認証は(おそらく GCP gem のレイヤで)デフォルトでなされている。