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 of31536000
seconds (one year) for long-running operations using theconnector_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 に聞くのが一番かもしれません・・・)