依排程執行工作

本頁說明如何使用 crontab 依排程執行 Cloud Run 工作。

必要的角色

如要取得本頁面所述作業所需的權限,請要求管理員在 Cloud Run 作業中授予下列其中一個 IAM 角色:

  • 如要使用 Google Cloud CLI 執行工作,請在 Cloud Run 工作中啟用 Cloud Run Invoker (roles/run.invoker)。
  • 如要使用 Cloud de Confiance 控制台執行工作、覆寫工作設定或取消工作執行作業,您必須具備 Cloud Run 工作的「Cloud Run 開發人員」 (roles/run.developer) 角色。

如要查看與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 作業會與Cloud de Confiance API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

授予服務帳戶專案存取權

如果您尚未為 Cloud Run 作業建立服務帳戶,請建立服務帳戶。例如:

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

將 SERVICE_ACCOUNT_NAME 替換成服務帳戶名稱,例如 job-scheduler。

如要取得服務帳戶執行作業所需的權限,請要求管理員授予服務帳戶專案的「作業執行者」(roles/run.jobsExecutor) 角色。例如:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:job-scheduler@PROJECT_ID.s3ns.iam.gserviceaccount.com \
    --role roles/run.jobsExecutor

將 PROJECT_ID 替換為專案 ID 名稱。

事前準備

  1. 如果尚未建立 Cloud Run 工作,請建立一個。
  2. 為專案啟用 Cloud Scheduler API:

    gcloud services enable cloudscheduler.googleapis.com
    

設定 Cloud Run 工作,依排程執行

如要依排程執行 Cloud Run 工作,請按照下列步驟操作:

  1. 建立名為 cloud-run-jobs-sched 的新目錄,然後切換至該目錄:

    mkdir cloud-run-jobs-sched
    cd cloud-run-jobs-sched
  2. 建立 Dockerfile 檔案,然後將下列程式碼貼入該檔案:

    FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:536.0.1
    
    RUN apt-get update -y && \
    apt-get install -y python3-dev python3-pip python3-venv && \
    apt-get install -y cron
    
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    ENV VIRTUAL_ENV=/opt/venv
    RUN python3 -m venv $VIRTUAL_ENV
    ENV PATH="$VIRTUAL_ENV/bin:$PATH"
    
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Set up the cron schedule.
    RUN crontab /app/cron
    
    CMD /app/entrypoint.sh
  3. 建立 entrypoint.sh 檔案,然後將下列幾行內容貼入該檔案:

    gcloud config set project $PROJECT
    gcloud config set run/region $REGION
    
    cron
    
    gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
  4. 建立 main.py 檔案,然後將下列 Python 程式碼貼入該檔案:

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello_world():
        return "Hello World!"
    
    if __name__ == "__main__":
        app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
  5. 建立 requirements.txt 檔案,並將下列依附元件貼到該檔案中:

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
  6. 在目錄中建立 cron 檔案,並新增 cron 排程來執行工作。例如:

    0 2 * * * gcloud run jobs execute --async test-job > /proc/1/fd/1 2>&1

    這項指令會每天凌晨 2 點執行名為 test-job 的工作。服務記錄會顯示啟動工作執行時發生的任何錯誤。

    如要為多項工作建立多個時間表,請更新 cron 檔案,加入要執行的工作及其相關聯的時間表。例如:

    ${cron_schedule} gcloud run jobs execute --async ${job_1} > /proc/1/fd/1 2>&1
    ${cron_schedule} gcloud run jobs execute --async ${job_2} > /proc/1/fd/1 2>&1
    ...
  7. 部署工作排程服務:

    gcloud run deploy JOB \
        --source . \
        --region REGION \
        --set-env-vars PROJECT=PROJECT_ID,REGION=REGION \
        --service-account SERVICE_ACCOUNT \
        --no-allow-unauthenticated \
        --min-instances=1 \
        --no-cpu-throttling

    更改下列內容:

    • JOB:Cloud Run 工作名稱。
    • REGION:Cloud Run 工作的區域,例如 europe-west1。
    • PROJECT_ID:您的專案 ID。
    • SERVICE_ACCOUNT:您的服務帳戶。

後續步驟

使用這項功能後,你可以執行下列操作: