1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Google Cloud の Cloud Run でアプリケーションを運用していたとき、非同期処理(ActiveJob)をどのように実行しようか悩んだことがあります。

そうした中で、Cloud Tasks に着目し、activejob-google_cloud_tasks-http gem を使って非同期処理を実現しました。

Cloud Run と非同期処理

Cloud Run サービスで、Rails アプリケーションを動かしていました。2026年6月時点では、Cloud Run ジョブや、Cloud Run ワーカープールといったリソースがありますが、本記事では Cloud Run サービスについて述べます。

Cloud Run サービスはリクエストをまたいでプロセスが常駐しているわけではなく、アイドル時はインスタンスがゼロにスケールインします。これは Sidekiq のような Redis をポーリングして Active Job を実行する構成では、最小インスタンス数を 1 に設定し常時稼働させる必要があります。Cloud Run のランニングコストに加え、 Redis を別途管理する運用・費用面のコストがかかると考えていました。

Cloud Tasks

Cloud Tasks は Google Cloud が提供するフルマネージドのタスクキューサービスです。

処理の流れはシンプルです。

  • アプリケーションが Cloud Tasks にタスク(HTTP リクエスト)をエンキューする
  • Cloud Tasks が指定したエンドポイントに HTTP POST リクエストを送信する
  • アプリケーションがリクエストを受け取り、ジョブを実行する

Cloud Tasks が HTTP ターゲットをサポートしているので、Cloud Runのエンドポイントを直接ジョブ実行先として指定できます。

また、Cloud Tasks は以下のような機能も備えています。

  • タスクのスケジューリング
  • 自動リトライ
  • レート制限
  • 重複排除

Cloud Run サービス側でエラーが発生して 200 以外のレスポンスを返した場合、Cloud Tasks が同じタスクをリトライします。再試行間隔は指数関数的バックオフ(再試行のたびに待機時間が指数的に伸びる方式)で行われます。なお、冪等性を担保する設計が必要であり、一意制約のあるレコードを保存する場合などには注意が必要です。

activejob-google_cloud_tasks-http

activejob-google_cloud_tasks-http は、Active Job のアダプターとして Cloud Tasks(HTTP ターゲット)を利用できるようにする gem です。

queue_as に渡した名前が Cloud Tasks のキュー名として使われ、ジョブの実行は Cloud Run のエンドポイントへの HTTP POST で行われます。

アプリケーション側では gem をインストールし、Active Job のアダプターを設定することで利用できます。Google Cloud 側では、Cloud Tasks キューの作成と、Cloud Tasks から Cloud Run を呼び出す際の認証に使うサービスアカウントの準備が必要です。

unless ARGV.include?("assets:precompile")
  Rails.application.config.active_job.queue_adapter =
    ActiveJob::GoogleCloudTasks::HTTP::Adapter.new(
      project: ENV["GOOGLE_CLOUD_PROJECT"],
      location: "asia-northeast1",
      url: ENV["JOB_RUNNER_URL"],
      client: Google::Cloud::Tasks.cloud_tasks(version: :v2beta3),
      # OIDC トークンで Cloud Run を認証する場合
      task_options: {
        oidc_token: {
          service_account_email: ENV["CLOUD_TASKS_SA_EMAIL"]
        }
      }
    )
end
Rails.application.routes.draw do
  mount ActiveJob::GoogleCloudTasks::HTTP::Rack.new, at: '/_jobs'
  # 他のルーティング...
end

運用時には、Web アプリケーションの Cloud Run サービスから Cloud Tasks にタスクをエンキューし、非同期処理実行用の Cloud Run サービスで Cloud Tasks からのリクエストを受け取って処理していました。これにより、非同期処理実行用の Cloud Run サービスは必要なときだけインスタンスが立ち上がるようになりました。

Cloud Tasks の料金は、1 か月あたり最初の 100 万回の呼び出しは無料です。詳細は以下の公式ページをご確認ください。

おわりに

activejob-google_cloud_tasks-http を使うことで、Redis などのミドルウェアを追加することなく、Cloud Run 上の Rails アプリから非同期ジョブを実行できます。Cloud Tasks のフルマネージドなキュー管理と Cloud Run のサーバーレス実行を組み合わせることで、インフラ管理の手間を最小限に抑えたアーキテクチャを実現できます。

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?