Ejecuta trabajos según un programa

En esta página, se describe cómo ejecutar trabajos de Cloud Run según un programa con crontab.

Roles obligatorios

Para obtener los permisos que necesitas para las operaciones descritas en esta página, pídele a tu administrador que te otorgue uno de los siguientes roles de IAM en tu trabajo de Cloud Run:

  • Para ejecutar trabajos con Google Cloud CLI: Invocador de Cloud Run (roles/run.invoker) en el trabajo de Cloud Run
  • Para ejecutar trabajos con la Cloud de Confiance consola, anular configuraciones de trabajos o cancelar ejecuciones de trabajos: Desarrollador de Cloud Run (roles/run.developer) en el trabajo de Cloud Run

Para obtener una lista de los roles y los permisos de IAM asociados con Cloud Run, consulta los roles de IAM de Cloud Run y los permisos de IAM de Cloud Run. Si tu trabajo de Cloud Run interactúa con lasCloud de Confiance APIs, como las bibliotecas cliente de Cloud, consulta la guía de configuración de identidades del servicio. Para obtener más información sobre cómo otorgar roles, consulta los permisos de implementación y cómo administrar el acceso.

Otorga acceso a la cuenta de servicio a tu proyecto

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

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

Reemplaza 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 trabajos, pídele a tu administrador que le otorgue el rol de Ejecutor de trabajos (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

Reemplaza PROJECT_ID por el nombre del ID de tu proyecto.

Antes de comenzar

  1. Crea un trabajo de Cloud Run si aún no lo hiciste.
  2. Habilita la API de Cloud Scheduler para tu proyecto:

    gcloud services enable cloudscheduler.googleapis.com
    

Configura un trabajo de Cloud Run para que se ejecute según un programa

Para ejecutar un trabajo de Cloud Run según un programa, sigue estos pasos:

  1. Crea un directorio nuevo llamado cloud-run-jobs-sched y usa el comando de cambio de directorio en él:

    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 el siguiente código de Python en él:

    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 agrega una programación de 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 un trabajo llamado test-job todos los días a las 2 a.m. Cualquier error que se produzca al iniciar la ejecución del trabajo se mostrará en los registros del servicio.

    Para crear varios programas para varios trabajos, actualiza el archivo cron con los trabajos que desees ejecutar, junto con su programa asociado. 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. Implementa el servicio de programador de trabajos:

    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

    Reemplaza lo siguiente:

    • JOB por el nombre del trabajo de Cloud Run.
    • REGION: La región del trabajo de Cloud Run, por ejemplo, europe-west1.
    • PROJECT_ID: Es el ID del proyecto.
    • SERVICE_ACCOUNT: Tu cuenta de servicio.

¿Qué sigue?

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