依排程執行工作

本頁面說明如何使用 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 名稱。

事前準備

如果尚未建立 Cloud Run 工作,請建立一個

設定依排程執行的 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_NAME \
        --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-NAME:Cloud Run 工作名稱。
    • PROJECT_ID:您的專案 ID。
    • REGION:Cloud Run 工作的區域,例如 europe-west1

後續步驟

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