Exécuter des jobs selon un calendrier

Cette page explique comment exécuter des tâches Cloud Run de manière planifiée à l'aide de crontab.

Rôles requis

Pour obtenir les autorisations nécessaires pour effectuer les opérations décrites sur cette page, demandez à votre administrateur de vous accorder l'un des rôles IAM suivants sur votre job Cloud Run :

  • Pour exécuter des jobs à l'aide de Google Cloud CLI : Demandeur Cloud Run (roles/run.invoker) sur le job Cloud Run.
  • Pour exécuter des jobs à l'aide de la Cloud de Confiance console, remplacer des configurations de jobs ou annuler des exécutions de jobs : Développeur Cloud Run (roles/run.developer) sur le job Cloud Run.

Pour obtenir la liste des rôles et des autorisations IAM associés à Cloud Run, consultez les sections Rôles IAM Cloud Run et Autorisations IAM Cloud Run. Si votre job Cloud Run communique avec Cloud de Confiance des API, telles que des bibliothèques clientes Cloud, consultez le guide de configuration de l'identité du service. Pour en savoir plus sur l'attribution de rôles, consultez les pages Autorisations de déploiement et Gérer les accès.

Autoriser le compte de service à accéder à votre projet

Si vous n'avez pas créé de compte de service pour votre job Cloud Run, créez-en un. Exemple :

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

Remplacez SERVICE_ACCOUNT_NAME par le nom de votre compte de service, par exemple job-scheduler.

Pour obtenir les autorisations dont votre compte de service a besoin pour exécuter des jobs, demandez à votre administrateur d'accorder à votre compte de service le rôle Exécuteur de jobs (roles/run.jobsExecutor) sur votre projet. Exemple :

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

Remplacez PROJECT_ID par le nom de votre ID de projet.

Avant de commencer

Créez un job Cloud Run si vous n'en avez pas encore créé.

Configurer un job Cloud Run pour qu'il s'exécute selon une programmation

Pour exécuter un job Cloud Run selon une programmation :

  1. Créez un répertoire nommé cloud-run-jobs-sched et modifiez les sous-répertoires comme suit :

    mkdir cloud-run-jobs-sched
    cd cloud-run-jobs-sched
  2. Créez un fichier Dockerfile et collez-y les lignes suivantes :

    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. Créez un fichier entrypoint.sh et collez-y les lignes suivantes :

    gcloud config set project $PROJECT
    gcloud config set run/region $REGION
    
    cron
    
    gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
  4. Créez un fichier main.py et collez-y le code Python suivant :

    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. Créez un fichier requirements.txt et collez-y les dépendances suivantes :

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
  6. Créez un fichier cron dans votre répertoire et ajoutez une programmation cron pour exécuter le job. Exemple :

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

    Cette commande exécute un job appelé test-job tous les jours à 2h du matin. Toutes les erreurs de démarrage de l'exécution du job s'affichent dans les journaux du service.

    Pour créer plusieurs programmations pour plusieurs jobs, mettez à jour le fichier cron avec les jobs que vous souhaitez exécuter, ainsi que leur programmation associée. Exemple :

    ${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. Déployez le service de programmation de jobs :

    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

    Remplacez les éléments suivants :

    • JOB-NAME par le nom de votre job Cloud Run
    • PROJECT_ID : ID du projet.
    • REGION : région de votre job Cloud Run, par exemple europe-west1.

Étape suivante

Après avoir utilisé cette fonctionnalité, vous pouvez effectuer les opérations suivantes :