Ejecutar tareas según una programación

En esta página se describe cómo ejecutar trabajos de Cloud Run de forma programada mediante crontab.

Roles obligatorios

Para obtener los permisos que necesitas para las operaciones descritas en esta página, pide a tu administrador que te asigne uno de los siguientes roles de gestión de identidades y accesos en tu trabajo de Cloud Run:

  • Para ejecutar tareas con Google Cloud CLI, usa Invocador de Cloud Run (roles/run.invoker) en la tarea de Cloud Run.
  • Para ejecutar tareas con la Cloud de Confiance consola, anular configuraciones de tareas o cancelar ejecuciones de tareas, debes tener el rol Desarrollador de Cloud Run (roles/run.developer) en la tarea de Cloud Run.

Para ver una lista de los roles y permisos de gestión de identidades y accesos asociados a Cloud Run, consulta los artículos Roles de gestión de identidades y accesos de Cloud Run y Permisos de gestión de identidades y accesos de Cloud Run. Si tu trabajo de Cloud Run interactúa con APIs deCloud de Confiance , como las bibliotecas de cliente de Cloud, consulta la guía de configuración de la identidad de servicio. Para obtener más información sobre cómo conceder roles, consulta los artículos sobre permisos de implementación y gestión del acceso.

Concede a la cuenta de servicio acceso a tu proyecto

Si no has creado una cuenta de servicio para tu trabajo de Cloud Run, crea una. Por ejemplo:

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

Sustituye SERVICE_ACCOUNT_NAME por el nombre de tu cuenta de servicio, por ejemplo, job-scheduler.

Para obtener los permisos que necesita tu cuenta de servicio para ejecutar tareas, pide a tu administrador que le conceda el rol Ejecutor de tareas (roles/run.jobsExecutor) en tu proyecto. Por ejemplo:

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

Sustituye PROJECT_ID por el nombre de tu ID de proyecto.

Antes de empezar

Crea un trabajo de Cloud Run si aún no lo has hecho.

Configurar una tarea de Cloud Run para que se ejecute según una programación

Para ejecutar una tarea de Cloud Run según una programación, haz lo siguiente:

  1. Crea un directorio llamado cloud-run-jobs-sched y cambia al directorio:

    mkdir cloud-run-jobs-sched
    cd cloud-run-jobs-sched
  2. Crea un archivo Dockerfile y pega las siguientes líneas en él:

    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. Crea un archivo entrypoint.sh y pega las siguientes líneas en él:

    gcloud config set project $PROJECT
    gcloud config set run/region $REGION
    
    cron
    
    gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
  4. Crea un archivo main.py y pega en él el siguiente código de 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. Crea un archivo requirements.txt y pega las siguientes dependencias en él:

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
  6. Crea un archivo cron en tu directorio y añade una programación cron para ejecutar el trabajo. Por ejemplo:

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

    Este comando ejecuta una tarea llamada test-job todos los días a las 2:00. Los errores que se produzcan al iniciar la ejecución del trabajo se mostrarán en los registros del servicio.

    Para crear varias programaciones para varios trabajos, actualiza el archivo cron con los trabajos que quieras ejecutar, junto con la programación asociada. Por ejemplo:

    ${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. Despliega el servicio de programador de tareas:

    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

    Haz los cambios siguientes:

    • JOB-NAME: el nombre de tu tarea de Cloud Run.
    • PROJECT_ID: tu ID de proyecto.
    • REGION: la región de tu trabajo de Cloud Run. Por ejemplo, europe-west1.

Siguientes pasos

Después de usar esta función, puedes hacer lo siguiente: