按计划执行作业

本页面介绍了如何使用 crontab 按时间表执行 Cloud Run 作业。

所需的角色

如需获得本页面中描述的操作所需的权限,请让管理员向您授予 Cloud Run 作业的以下 IAM 角色之一:

  • 如需使用 Google Cloud CLI 执行作业:Cloud Run 作业的 Cloud Run Invoker (roles/run.invoker) 角色。
  • 如需使用 Cloud de Confiance 控制台执行作业、替换作业配置或取消作业执行:Cloud Run 作业的 Cloud Run Developer (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)。

如需获得服务账号执行作业所需的权限,请让管理员向您的服务账号授予项目的 Jobs Executor (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

后续步骤

使用此功能后,您可以执行以下操作: