Planifier des tâches avec Cron pour Python

Le service Cron d'App Engine vous permet de configurer des tâches planifiées régulièrement qui s'exécutent à des heures définies ou à intervalles réguliers. Ces tâches sont communément appelées tâches Cron. Ces tâches Cron sont automatiquement déclenchées par le service Cron d'App Engine. Par exemple, vous pouvez utiliser une tâche Cron pour envoyer quotidiennement un rapport par e-mail, pour mettre à jour des données en cache toutes les 10 minutes ou pour actualiser les informations de résumé une fois par heure.

Chaque tâche Cron envoie une demande HTTP GET à une URL, selon les paramètres planifiés. Le gestionnaire de cette URL exécute la logique lors de l'appel. Une demande de tâche Cron est soumise aux mêmes limites que celles des files d'attente d'envoi de tâches.

Créer une tâche Cron

  1. Créez le fichier cron.yaml dans le répertoire racine de votre application (avec app.yaml).
  2. Ajoutez une ou plusieurs entrées <cron> à votre fichier et définissez les éléments nécessaires à votre tâche, y compris les éléments <url> et <schedule> requis.

    Dans l'exemple suivant, une tâche Cron de base s'exécutant quotidiennement a été créée :

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    La spécification cible est facultative et correspond au nom d'un service / d'une version. Le cas échéant, la cible est ajoutée au début du nom d'hôte de votre application, ce qui a pour effet d'acheminer la tâche vers ce service / cette version. Si aucune cible n'est spécifiée, la tâche s'exécute dans les versions du service default configurées pour le trafic.

  3. Créez un gestionnaire pour l'URL de la tâche Cron. Le gestionnaire doit exécuter toutes les tâches que vous souhaitez planifier. Le gestionnaire doit répondre avec un code d'état HTTP compris entre 200 et 299 (inclus) pour indiquer que l'opération a réussi. D'autres codes d'état peuvent être renvoyés et peuvent être utilisés pour déclencher de nouvelles tentatives d'exécution de la tâche Cron.

En savoir plus sur la syntaxe et les options de cron.yaml.

Tester les tâches Cron sur le serveur de développement

Le serveur de développement local n'exécute pas automatiquement les tâches Cron. Vous pouvez faire des demandes directement à l'URL de la tâche Cron pour en tester la fonctionnalité. Vous pouvez vous servir de l'interface Cron locale ou de l'interface de gestion des tâches planifiées pour déclencher les URL associées à vos tâches avec curl ou un outil similaire.

Vous pouvez utiliser l'interface d'administration du serveur de développement local pour afficher les tâches Cron sur http://localhost:8000/cron.

Exécuter à nouveau les tâches Cron qui échouent

Si le gestionnaire de requêtes d'une tâche Cron renvoie un code d'état qui n'est pas compris entre 200 et 299 (inclus), App Engine considère que la tâche a échoué. Par défaut, les tâches qui ont échoué ne font pas l'objet de nouvelles tentatives, sauf si un code d'état 503 est renvoyé. Dans ce cas, elles sont relancées toutes les minutes jusqu'à ce qu'elles aboutissent ou jusqu'au renvoi d'un code d'état compris entre 200 et 299.

Pour configurer de nouvelles tentatives d'exécution des tâches ayant échoué :

  1. Incluez un bloc retry_parameters dans votre fichier cron.yaml.
  2. Choisissez et définissez les paramètres de nouvelle tentative dans le bloc retry_parameters.

    Voici un exemple de fichier cron.yaml contenant une seule tâche Cron configurée pour être relancée jusqu'à cinq fois (valeur par défaut) avec un intervalle initial de 2,5 secondes entre les tentatives, qui double à chaque nouvelle tentative.

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

En savoir plus sur les options de nouvelle tentative de cron

Déployer des tâches Cron

Pour déployer les tâches Cron spécifiées dans le fichier de configuration cron.yaml, exécutez la commande suivante :

gcloud

gcloud app deploy cron.yaml

appcfg

Si vous utilisez le SDK App Engine d'origine, exécutez cette commande :

appcfg.py update_cron [YOUR_APP_DIR]

Supprimer toutes les tâches Cron

Pour supprimer toutes les tâches Cron :

  1. Remplacez le contenu du fichier cron.yaml par :

    cron:
    

  2. Déployez le fichier cron.yaml sur App Engine.

Sécuriser des URL pour Cron

Un gestionnaire Cron n'est autre qu'un gestionnaire normal défini dans le fichier app.yaml. Vous pouvez empêcher les utilisateurs d'accéder aux URL utilisées par les tâches planifiées en n'accordant l'accès qu'aux comptes administrateurs. Les tâches planifiées peuvent accéder aux URL réservées aux administrateurs. Vous pouvez restreindre l'accès à une URL en ajoutant login: admin à la configuration du gestionnaire dans le fichier app.yaml.

Voici un exemple dans le fichier app.yaml :

runtime: python27
api_version: 1

handlers:
- url: /report/weekly
  script: reports.app
  login: admin
Pour en savoir plus, découvrez comment demander la connexion ou le statut Administrateur dans la documentation de référence app.yaml.

Pour tester une tâche Cron, connectez-vous en tant qu'administrateur et accédez à l'URL du gestionnaire dans votre navigateur.

Les requêtes du service Cron contiennent également un en-tête HTTP :

X-Appengine-Cron: true

L'en-tête X-Appengine-Cron est défini en interne par Google App Engine. Si le gestionnaire de requêtes trouve cet en-tête, il peut valider qu'il s'agit d'une requête Cron. Si l'en-tête est présent dans une requête d'utilisateur externe adressée à votre application, il est supprimé, sauf dans les requêtes des administrateurs connectés de l'application qui sont autorisés à définir l'en-tête à des fins de test.

Google App Engine émet les requêtes Cron à partir de l'adresse IP 0.1.0.1.

Appeler Google Cloud Endpoints

Vous ne pouvez pas spécifier de point de terminaison Google Cloud Endpoints dans le champ url d'une tâche Cron. Si vous souhaitez que votre tâche Cron appelle un point de terminaison Google Cloud Endpoints, envoyez une requête à une cible diffusée par un gestionnaire dans votre application, puis appelez la classe et la méthode du point de terminaison à partir du code du gestionnaire.

Afficher des tâches Cron dans la console GCP

Vous pouvez vérifier les tâches Cron planifiées sur la page Tâches Cron de la console GCP.

Vous pouvez également afficher les journaux pour savoir quand des tâches Cron ont été ajoutées ou supprimées.

En savoir plus

Pour en savoir plus sur la configuration des tâches Cron consultez la documentation de référence sur le fichier cron.yaml.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement standard App Engine pour Python