タスクのタイムアウトを設定する(ジョブ)

デフォルトでは、各タスクは最大 10 分間実行されます。この時間は短くすることも、長くすることも可能です(最長 168 時間(7 日間)まで)。24 時間を超えるタイムアウトのサポートはプレビュー版で利用できます。

このページの説明に従って、タスクのタイムアウトを設定します。ジョブの実行に明示的なタイムアウトはありません。すべてのタスクが完了すると、ジョブの実行は完了します。

単位を使用して期間を指定します。タイムアウト時間は、秒、分、時間の整数値で指定できます。たとえば、タイムアウト時間を 10 分 5 秒に設定するには、値を 605 秒と指定します。

ジョブで再試行が有効になっている場合、タイムアウトの設定はタスクの試行ごとに適用されます。この時間内にタスクが完了しない場合、タスクは停止されます。ジョブの実行時間が長くなるほど、ダウンストリームの依存関係の失敗、メモリ不足エラー、インフラストラクチャの問題など、ジョブの失敗につながる問題が発生する可能性が高くなります。すべてのジョブで再試行を有効にすることをおすすめします。特に、長時間実行タスクを含むジョブでは有効にすることをおすすめします。

メンテナンス イベントの監視と処理

ジョブは定期的にメンテナンス イベントを受けることがあります。メンテナンス イベント中、進行中のタスクは現在のマシンから別のマシンに移行されます。この移行プロセスで、タスクの全体の状態が保持されます。ただし、タスクの移行中は処理が一時的に停止します。

メンテナンス イベントは透過的です。メンテナンス イベントを処理するためにコンテナを変更する必要はありません。タスクの開始と移行が終了するたびに、Cloud Run がログメッセージを出力します。

ただし、メンテナンス イベントを特定の方法でモニタリングまたは処理する場合は、タスクの 10 秒前に送信された SIGTSTP シグナルをキャッチします。移行後、再起動後すぐにタスクは SIGCONT シグナルを受け取ります。

次の Go サンプルは、これらのシグナルをキャッチしてログエントリを出力する関数です。

func testSignals() {
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGTSTP, syscall.SIGCONT)
    go func() {
        for  {
            sig := <-sigs
            log.Printf("Got Signal: %v", sig)
        }
    }()
 }
 

必要なロール

Cloud Run ジョブの構成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run ジョブが Google Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

タスク タイムアウトを設定する

Cloud Run ジョブのタスク タイムアウトを指定するには:

コンソール

  1. Google Cloud コンソールで Cloud Run の [ジョブ] ページに移動します。

    Cloud Run に移動

  2. [コンテナをデプロイ] をクリックし、[ジョブ] を選択して、ジョブの初期設定ページに入力します。既存のジョブを構成する場合は、ジョブをクリックして [編集] をクリックします。

  3. [コンテナ、変数とシークレット、接続、セキュリティ] をクリックして、ジョブのプロパティ ページを開きます。

  4. [全般] タブをクリックします。

    イメージ

    • [タスクのタイムアウト] フィールドで、現在のジョブのジョブタスクの最長時間を指定し、[時間単位] を選択します。タイムアウト時間は、時間の整数値でのみ指定できます。たとえば、10 分 5 秒の期間を設定するには、[タスクのタイムアウト] フィールドに 605 を指定し、[時間単位] で [] を選択します。
  5. [作成] または [更新] をクリックします。

gcloud

  1. ジョブを作成する場合:

    gcloud run jobs create JOB_NAME --image IMAGE_URL --task-timeout TIMEOUT

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

    • JOB_NAME: ジョブの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/job:latest など)。
    • TIMEOUT: ジョブタスクの最大期間。時間と単位を指定します。たとえば、10m5s は 10 分 5 秒です。
  2. ジョブを更新する場合:

    gcloud run jobs update JOB_NAME --task-timeout TIMEOUT

YAML

  1. 新しいジョブを作成する場合は、この手順をスキップします。既存のジョブを更新する場合は、その YAML 構成をダウンロードします。

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. timeoutSeconds: 属性を更新します。

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - image: IMAGE
              timeoutSeconds: TIMEOUT

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

    • JOB_NAME: ジョブの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/job:latest など)。
    • TIMEOUT: ジョブタスクの最長時間。時間の数値と単位を指定します。時間は、秒、分、時間の整数値で指定できます。たとえば、10 分 5 秒の期間を設定するには、605s を指定します。

    環境変数やメモリ上限など他の構成の詳細を指定することもできます。

  3. 既存のジョブ構成を更新します。

    gcloud run jobs replace job.yaml

Terraform

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

Cloud Run ジョブのタスク タイムアウトを指定するには、google_cloud_run_v2_job リソースを使用して、次のスニペットを main.tf ファイルに適用します。

resource "google_cloud_run_v2_job" "default" {
  name     = "cloud-run-job-timeout"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    template {
      timeout = "3.500s"

      containers {
        image = "us-docker.pkg.dev/cloudrun/container/job:latest"
      }
    }
  }
}

タスクのタイムアウトの設定を表示する

Cloud Run ジョブのタスク タイムアウトの現在の設定を表示するには:

コンソール

  1. Google Cloud コンソールで Cloud Run の [ジョブ] ページに移動します。

    Cloud Run の [ジョブ] に移動

  2. 目的のジョブをクリックして、[ジョブの詳細] ページを開きます。

  3. [構成] タブをクリックします。

  4. 構成の詳細でタスクのタイムアウト設定を見つけます。

gcloud

  1. 次のコマンドを使用します。

    gcloud run jobs describe JOB_NAME
  2. 返された構成で、タスクのタイムアウトの設定を見つけます。

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

source "https://rubygems.org"

gem "functions_framework", "~> 1.4"