Cloud Workflows から Cloud Run jobs を実行している時にタイムアウトになる

エヌデーデー関口です。

Cloud Run jobs を使った自動化を行う際、Cloud Workflows と連携して実行するというパターンは多いかと思います。今回はこの組み合わせの際に発生したタイムアウトについてご紹介します。

事象

Cloud Workflows から Cloud Run jobs を実行している時に、Cloud Run jobs 側は正常終了しているのにもかかわらず、Cloud Workflows は次のようなエラーが発生している。

Timeout of 1800 seconds exceeded. The timeout occurred during operation status polling.

設定内容

Cloud Workflows

Cloud Run jobs の実行には、Connector を利用しており、タイムアウトの指示は行っていません。

- run_job:
    call: googleapis.run.v1.namespaces.jobs.run
    args:
      name: ${"namespaces/" + project_id + "/jobs/" + job_name}
      location: ${location}
      body:
        overrides:
          containerOverrides:
            args:
              - ${"--file_name=" + event_file}
              - ${"--input_bucket=" + event_bucket}
    result: execution

なお、Cloud Workflows をデプロイするときに、タイムアウトを設定することはできないのですが、公式ドキュメント をみると割り当ては最大 1 年となっています。

Cloud Run jobs

ジョブのデプロイには、タイムアウト (task_timeout) を1時間に設定しています。

gcloud run jobs deploy ${JOB_NAME} \
--image ${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/${JOB_NAME}:latest \
--region ${REGION} \
--task-timeout 60m \
--service-account ${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

リファレンスから

googleapis.run.v1.namespaces.jobs.run コネクターのリファレンスを読んでみます。

This method waits—the workflow execution is paused—until the operation is complete, fails, or times out. The default timeout value is 1800 seconds (30 minutes) and can be changed to a maximum value of 31536000 seconds (one year) for long-running operations using the connector_params field. See the Connectors reference.

(翻訳)

このメソッドは、操作が完了、失敗、またはタイムアウトするまで待機します(ワークフローの実行は一時停止されます)。デフォルトのタイムアウト値は1800秒(30分)で、コネクタが長時間の操作を実行する場合、connector_paramsフィールドを使用して最大31536000秒(1年)まで変更できます。詳細はコネクタリファレンスを参照してください。

この制限によって、先ほどのエラーが出ていたようです。また、他の Connector についても同様の記述が冒頭に書いてありました。

対策

リファレンスに示されている Connectors reference を確認してみましょう。

- STEP_NAME:
    call: CONNECTOR
    args:
        ARG: ARG_VALUE
        [...]
        body:
            KEY:KEY_VALUE
            [...]
        connector_params:
            timeout: TIMEOUT_IN_SECONDS
            polling_policy:
                initial_delay: INITIAL_DELAY_IN_SECONDS
                multiplier: MULTIPLIER_VALUE
                max_delay: MAX_DELAY_IN_SECONDS
            skip_polling: SKIP_POLLING_SWITCH 
            scopes:  OAUTH2_SCOPE 
    result: RESPONSE_VALUE

connector_params:timeout という項目があります。この標準時が 1800秒(30分)となっていました。

これを 1時間であれば 3600秒にすることで、タイムアウトを回避することができます。

従って先ほどの yaml 記述は次のようになります。

- run_job:
    call: googleapis.run.v1.namespaces.jobs.run
    args:
      name: ${"namespaces/" + project_id + "/jobs/" + job_name}
      location: ${location}
      body:
        overrides:
          containerOverrides:
            args:
              - ${"--file_name=" + event_file}
              - ${"--input_bucket=" + event_bucket}
      connector_params:
          timeout: 3600  # 1時間にする場合
    result: execution

まとめ

今回久しぶりに Workflows を使って Cloud Run jobs を設定していたら、ジョブが 31分で成功してるのに Workflows でエラーが出たということで、改めてコネクター周りを調べてみたという記事でした。

Google Cloud の公式ドキュメントは個人的には非常に読みやすいと感じています。しかし量が非常に多いので、調べるのは大変ですね。(Gemini に聞くのが一番かもしれません・・・)