スケジュールに従ってサービスを実行する

Cloud Scheduler を使用してスケジュールに沿って安全に Cloud Run サービスをトリガーできます。これは cron ジョブを使用するのと同様です。

考えられるユースケースには、次のようなものがあります。

  • スケジュールを指定したバックアップの実行
  • 次のような繰り返しの管理タスクを実行する方法は次のとおりです。
    • サイトマップの再生成
    • 古いデータ、コンテンツ、構成、リビジョンの削除
    • データシステム間のコンテンツの同期
    • 毎日受信するメール通知の処理
    • ダウンストリーム サービスに対するアクセスの確認と報告
  • 請求書などのドキュメントの生成

このページでは、同じ Google Cloud プロジェクト内で安全に Cloud Scheduler を Cloud Run と連携させて使用する方法を説明します。

始める前に

使用しているプロジェクトで Cloud Scheduler API を有効にします

サービスを作成してデプロイする

作成してデプロイする方法は次のとおりです。

  1. サービスの中で、スケジュールに従って実行するジョブを実装します。

  2. サービスが受け取りを想定しているジョブ リクエストのリクエスト タイプ(たとえば GETPOST)をメモします。サービスを呼び出すスケジュールされたジョブを作成するときは、これに一致する HTTP メソッドを指定する必要があります。

  3. Cloud Scheduler で使用しているサービスをデプロイするときは、未承認の呼び出しを許可しないでください。

次の例は、Terraform を使用して Cloud Run サービスをデプロイする方法を示しています。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-scheduled-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

us-docker.pkg.dev/cloudrun/container/hello は、独自のコンテナ イメージへの参照に置き換えます。

Cloud Scheduler 用のサービス アカウントを作成する

Cloud Scheduler に関連付けるサービス アカウントを作成し、そのサービス アカウントに Cloud Run サービスを呼び出す権限を付与する必要があります。既存のサービス アカウントを使用して、Cloud Scheduler を表すか、新たに作成することもできます。

サービス アカウントを作成し、Cloud Run サービスを呼び出す権限を付与するには、以下の手順を実行します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。

  3. Google Cloud コンソールに表示するサービス アカウント名を入力します。

    この名前に基づいてサービス アカウント ID が生成され、Google Cloud コンソールに表示されます。必要に応じて ID を編集します。後で ID を変更することはできません。

  4. (省略可)サービス アカウントの説明を入力します。

  5. [作成して続行] をクリックします。

  6. (省略可)[ロールを選択] フィールドをクリックします。

  7. [Cloud Run] > [Cloud Run 起動元] を選択します。

  8. [完了] をクリックします。

コマンドライン

  1. サービス アカウントを作成します。

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
       --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"

    次のように置き換えます。

    • SERVICE_ACCOUNT_NAME は、Google Cloud プロジェクト内で一意の小文字の名前(my-invoker-service-account-name など)に置き換えます。
    • DISPLAYED_SERVICE_ACCOUNT_NAME は、このサービス アカウントに対してコンソール上で表示する名前(My Invoker Service Account など)に置き換えます。
  2. Cloud Run では、サービス アカウントにサービスを呼び出す権限を付与します。

    gcloud run services add-iam-policy-binding SERVICE \
       --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/run.invoker

    次のように置き換えます。

    • SERVICE は、Cloud Scheduler によって呼び出されるようにするサービスの名前に置き換えます。
    • SERVICE_ACCOUNT_NAME は、サービス アカウントの名前に置き換えます。
    • PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
  3. サービス アカウントにプロジェクトへのアクセス権を付与すると、プロジェクト内のリソースに対して特定の操作を行う権限が与えられます。

    gcloud projects add-iam-policy-binding RESOURCE_ID \
       --member=PRINCIPAL --role=roles/run.invoker

    次のように置き換えます。

    • RESOURCE_ID: Google Cloud プロジェクト ID。

    • PRINCIPAL: プリンシパルまたはメンバーの識別子。通常、PRINCIPAL_TYPE:ID の形式です(たとえば、user:my-user@example.com)。PRINCIPAL に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

Terraform を使用してサービス アカウントを作成するには、次のコマンドを実行します。

resource "google_service_account" "default" {
  account_id   = "scheduler-sa"
  description  = "Cloud Scheduler service account; used to trigger scheduled Cloud Run jobs."
  display_name = "scheduler-sa"

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.iam_api
  ]
}

resource "google_cloud_run_service_iam_member" "default" {
  location = google_cloud_run_v2_service.default.location
  service  = google_cloud_run_v2_service.default.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:${google_service_account.default.email}"
}

Cloud Scheduler ジョブを作成する

指定した時間にサービスを呼び出すジョブを作成する必要があります。コンソールとコマンドラインのいずれかを使用できます。

ジョブを作成するには、コンソールまたは gcloud コマンドラインを使用できます。該当するタブをクリックしてください。

Console

  1. Cloud Scheduler コンソール ページにアクセスします。

    Cloud Scheduler に移動

  2. [ジョブを作成] をクリックします。

    スクリーンショット

  3. ジョブの名前を指定します。

  4. 構成文字列を使用して、ジョブを実行する頻度(ジョブ間隔)を設定します。たとえば文字列 0 */3 * * * を指定すると、ジョブが 3 時間ごとに実行されます。ここで指定する文字列には、crontab に対応した任意の文字列を使用できます。

    詳細については、ジョブ スケジュールの構成をご覧ください。

  5. プルダウン リストから、ジョブの頻度に使用するタイムゾーンを選択します。

  6. ターゲットとして「HTTP」を指定します。

    1. たとえば、サービスの完全修飾された URL を指定します(たとえば、https://myservice-abcdef-uc.a.run.app など)。そのジョブがこの URL にリクエストを送信します。

    2. HTTP メソッドを指定します。このメソッドは、以前にデプロイした Cloud Run サービスが想定しているものと一致している必要があります。デフォルトは POST です。

    3. 必要に応じて、ターゲットに送信するデータを指定します。このデータは、HTTP メソッド POSTPUT のいずれかが選択されると、リクエストの本文に入れて送信されます。

    4. [その他] をクリックして認証設定を表示します。

    5. プルダウン メニューから [OIDC トークンを追加] を選択します。

    6. [サービス アカウント] フィールドに、以前に作成したサービス アカウントのメールアドレスをコピーします。

    7. [Audience] フィールドに、サービスの完全な URL をコピーします。

  7. [作成] をクリックして、ジョブを作成して保存します。

コマンドライン

Cloud Scheduler から認証済みの Cloud Run サービスにアクセスするには、OIDC 認証を使用する必要があります。OIDC 認証にはサービス アカウントとオーディエンスのフラグが含まれます。詳細については、HTTP ターゲットの認証を使用するをご覧ください。

Cloud Scheduler ジョブを作成するには:

gcloud scheduler jobs create http test-job --schedule "5 * * * *" 
--http-method=HTTP-METHOD
--uri=SERVICE-URL
--oidc-service-account-email=SERVICE-ACCOUNT-EMAIL
--oidc-token-audience=SERVICE-URL

次のように置き換えます。

  • HTTP-METHOD を、HTTP メソッド(GET、POST、PUT など)に置き換えます。
  • SERVICE-URL を、実際のサービス URL に置き換えます。
  • SERVICE-ACCOUNT-EMAIL を、実際のサービス アカウントのメールアドレスに置き換えます。

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

Cloud Run サービスの Cloud Scheduler ジョブを作成する方法は次のとおりです。

resource "google_cloud_scheduler_job" "default" {
  name             = "scheduled-cloud-run-job"
  region           = "us-central1"
  description      = "Invoke a Cloud Run container on a schedule."
  schedule         = "*/8 * * * *"
  time_zone        = "America/New_York"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "POST"
    uri         = google_cloud_run_v2_service.default.uri

    oidc_token {
      service_account_email = google_service_account.default.email
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.scheduler_api
  ]
}

Cloud Run サービスは、定義した頻度で Cloud Scheduler ジョブによるリクエストによってトリガーされます。これは、このサービスのログを調べることで確認できます。

次のステップ