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 Cloud de Confiance las 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 permisos de implementación y administra el acceso.

Otorga acceso a tu proyecto a la cuenta de servicio

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

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

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, haz lo siguiente:

  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 un programa 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 inicie 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 deseas 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 del programador de trabajos:

    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

    Reemplaza lo siguiente:

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

¿Qué sigue?

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