跳至主要内容

Run Batch Work with Cloud Run Jobs

Cloud Run Job 適合執行「有開始、有結束」的 container workload,例如 ETL、資料匯入、備份、爬蟲與定期報表。

Service vs. Job​

項目ServiceJob
觸發方式HTTP request、event手動、排程或 workflow
Container持續等待 request完成工作後 exit
Port需要監聽 PORT不需要,也不應啟動 Web server
成功條件回應 requestexit code 0
失敗處理request error、revisiontask retry、execution failure

如果你的程式本來是一次性 Python script,不要為了執行它而包成一直等待 request 的 Service;使用 Job 通常比較清楚。

Step 1: Prepare a Job Container​

建立 job.py:

import os
import time


print("starting batch job")
print(f"batch_id={os.environ.get('BATCH_ID', 'local')}")

# 在這裡執行 ETL、備份或資料處理工作
for item in range(3):
print(f"processing item {item}")
time.sleep(1)

print("batch job completed")

Job container 不需要 Flask、Gunicorn 或 HTTP server。它應該在工作完成後自然結束。

Dockerfile 範例:

FROM python:3.13-slim

WORKDIR /app
COPY job.py .

CMD ["python", "job.py"]

建立並推送 image 的流程,請參考 Build and Push a Container Image。

Step 2: Deploy a Job with gcloud​

gcloud run jobs deploy tkr101-batch-job \
--image=asia-east1-docker.pkg.dev/PROJECT_ID/tkr101-repo/cloud-run-job:v1 \
--region=asia-east1 \
--tasks=1 \
--max-retries=1 \
--task-timeout=10m

設定 environment variable:

gcloud run jobs update tkr101-batch-job \
--region=asia-east1 \
--update-env-vars=BATCH_ID=demo-001

Job 的 task timeout 預設為 10 分鐘,可依需求調整;官方目前的最大值與 GPU 限制請以最新文件為準。

Step 3: Execute the Job​

執行並等待完成:

gcloud run jobs execute tkr101-batch-job \
--region=asia-east1 \
--wait

列出 Job executions:

gcloud run jobs executions list \
--job=tkr101-batch-job \
--region=asia-east1

查看 Job log:

gcloud run jobs logs read tkr101-batch-job \
--region=asia-east1 \
--limit=50

Step 4: Configure in the Console​

  1. 開啟 Cloud Run → Jobs。
  2. 點選 Deploy container。
  3. 選擇 Artifact Registry image。
  4. 設定 Job name 與 Region。
  5. 在 container 設定 CPU、Memory 與 task timeout。
  6. 設定 Number of tasks。
  7. 設定 Number of retries per failed task。
  8. 依 workload 設定 parallelism。
  9. 點選 Create。
  10. 在 Job 詳細頁點選 Execute。

Exit Code and Idempotency​

成功的 Job container 應回傳 0:

python job.py
printf 'exit code: %s\n' "$?"

如果部分工作完成後才失敗,Cloud Run retry 可能再次執行同一批資料。因此 ETL 應考慮:

  • 使用 batch id 或 source file generation 去重。
  • 寫入前先檢查是否已完成。
  • 使用 staging table,再以 transaction 或 merge 發佈。
  • 將外部副作用與資料處理分開。
  • 記錄 execution name、task index 與輸入範圍。

Schedule a Job​

Cloud Run Job 本身負責執行,不等於排程器。可以使用 Cloud Scheduler、Workflows 或其他 orchestration tool 觸發 Job。

Cloud Scheduler / Workflows
│
▼
Cloud Run Jobs Execute API
│
▼
Cloud Run Job execution

排程觸發器也需要自己的 IAM 權限,不要讓公開 HTTP endpoint 任意啟動高成本 Job。

Cost and Timeout Notes​

  • Job 只在 task 執行時使用 CPU/Memory,但仍可能有 image、registry、network 或其他服務費用。
  • Timeout 應足以完成工作,也要能阻止無窮迴圈。
  • Retry 會重新消耗資源,且可能重複寫入或呼叫外部 API。
  • 遇到 timeout 時,先檢查瓶頸與資料切分,不要只把 timeout 無限調大。

Cleanup​

列出 Job:

gcloud run jobs list --region=asia-east1

刪除練習用 Job:

gcloud run jobs delete tkr101-batch-job \
--region=asia-east1

確認 image 不再使用後,再清理 Artifact Registry 中的 image 或 repository。

Further Reading​