Programar tareas con cron en Python 2

El servicio Cron de App Engine te permite configurar tareas programadas para que se ejecuten a horas concretas o en intervalos regulares. Estas tareas se conocen comúnmente como tareas cron. El servicio Cron de App Engine activa automáticamente estas tareas cron. Por ejemplo, puedes usar un trabajo cron para enviar un informe por correo electrónico a diario, actualizar algunos datos almacenados en caché cada 10 minutos o actualizar la información de resumen una vez por hora.

Una tarea cron envía una solicitud HTTP GET programada al endpoint especificado en la misma aplicación en la que se configura la tarea cron. El controlador de ese endpoint ejecuta la lógica cuando se llama.

El servicio Cron de App Engine no se puede usar para llamar a endpoints web fuera de la aplicación host de App Engine. Tampoco se puede usar para llamar a endpoints de App Engine desde otras aplicaciones que no sean la aplicación host.

Las solicitudes de tareas cron están sujetas a los mismos límites que las de las colas de tareas push.

Antes de empezar

Para implementar o actualizar programaciones, tu cuenta debe tener uno de los siguientes roles de gestión de identidades y accesos:

  • Propietario
  • Editor

Puedes definir el permiso en la página Gestión de identidades y accesos de la Google Cloud consola.

Crear una tarea cron

  1. Crea el archivo cron.yaml en el directorio raíz de tu aplicación (junto a app.yaml).
  2. Añada una o varias entradas <cron> al archivo y defina los elementos necesarios para su trabajo, incluidos los elementos obligatorios <url> y <schedule>. Consulta la sintaxis y las opciones de cron.yaml para obtener más información sobre los elementos del archivo cron.yaml.

    En el siguiente ejemplo se crea un trabajo cron básico que se ejecuta a diario:

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

    La especificación de destino es opcional y es el nombre de un servicio o una versión. Si está presente, el destino se añade al principio del nombre de host de tu aplicación, lo que provoca que el trabajo se dirija a ese servicio o versión. Si no se especifica ningún destino, el trabajo se ejecutará en las versiones del default servicio que estén configuradas para el tráfico.

  3. Crea un controlador para la URL de la tarea cron. El controlador debe ejecutar las tareas que quieras programar. El controlador debe responder con un código de estado HTTP entre 200 y 299 (ambos incluidos) para indicar que la solicitud se ha realizado correctamente. Se pueden devolver otros códigos de estado, que se pueden usar para volver a intentar la tarea cron.

Probar tareas cron en el servidor de desarrollo

El servidor de desarrollo local no ejecuta automáticamente tus tareas cron. Puedes enviar solicitudes directamente a la URL de tu tarea cron para probar su funcionalidad. Puedes usar tu interfaz local de cron o de tareas programadas para activar las URLs de tus trabajos con curl o una herramienta similar.

Puedes usar la interfaz de administrador del servidor de desarrollo local para ver tus tareas cron en http://localhost:8000/cron.

Reintentar tareas cron que fallan

Si el controlador de solicitudes de un trabajo cron devuelve un código de estado que no está en el intervalo 200-299 (inclusive), App Engine considera que el trabajo ha fallado. De forma predeterminada, los trabajos fallidos no se vuelven a intentar a menos que se devuelva un código de estado 503, en cuyo caso se vuelve a intentar cada minuto hasta que se complete correctamente o devuelva un código de estado entre 200 y 299.

Para configurar que se vuelvan a intentar las tareas fallidas, sigue estos pasos:

  1. Incluye un bloque retry_parameters en tu archivo cron.yaml.
  2. Elige y define los parámetros de reintento en el bloque retry_parameters.

    Por ejemplo, este archivo cron.yaml de muestra contiene una sola tarea cron configurada para reintentarse hasta cinco veces (el valor predeterminado) con un tiempo de espera inicial de 2,5 segundos que se duplica cada vez.

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

Más información sobre las opciones de reintento de cron

Desplegar tareas cron

Para implementar los trabajos cron especificados en el archivo de configuración cron.yaml, ejecuta el siguiente comando:

gcloud app deploy cron.yaml

Eliminar todas las tareas cron

Para eliminar todos los cron jobs, sigue estos pasos:

  1. Edita el contenido del archivo cron.yaml para que sea el siguiente:

    cron:
    
  2. Despliega el archivo cron.yaml en App Engine.

Proteger URLs para cron

Un controlador cron es un controlador normal definido en app.yaml. Puedes impedir que los usuarios accedan a las URLs que usan las tareas programadas restringiendo el acceso a las cuentas de administrador. Las tareas programadas pueden acceder a URLs solo para administradores. Puedes restringir una URL añadiendo login: admin a la configuración del controlador en app.yaml.

Por ejemplo, en app.yaml, podría tener este aspecto:

runtime: python27
api_version: 1

handlers:
- url: /report/weekly
  script: reports.app
  login: admin
Para obtener más información, consulta cómo requerir el inicio de sesión o el estado de administrador en la referencia de app.yaml.

Para probar un trabajo cron, inicia sesión como administrador y visita la URL del controlador en tu navegador.

Las solicitudes procedentes del servicio cron contienen también una cabecera HTTP:

X-Appengine-Cron: true

App Engine define el encabezado X-Appengine-Cron internamente. Si el controlador de solicitudes encuentra este encabezado, puede confiar en que la solicitud es una solicitud cron. Si el encabezado está presente en una solicitud de un usuario externo a tu aplicación, se elimina, excepto en el caso de las solicitudes de administradores que hayan iniciado sesión en la aplicación, que pueden definir el encabezado con fines de prueba.

App Engine envía solicitudes Cron desde la dirección IP 0.1.0.2. En el caso de las tareas cron creadas con versiones anteriores de gcloud (anteriores a la 326.0.0), las solicitudes cron procederán de 0.1.0.1.

Llamar a Google Cloud Endpoints

No puedes especificar un endpoint de Google Cloud en el campo url de un trabajo cron. Si quieres que tu trabajo cron llame a un endpoint de Google Cloud, envía una solicitud a un destino que sirva un controlador de tu aplicación y llama a la clase y al método del endpoint desde el código del controlador.

Ver tareas cron en la Google Cloud consola

Puedes ver las tareas cron programadas en la pestaña Tareas cron de App Engine de Cloud Scheduler.

También puedes ver los registros para saber cuándo se añadieron o quitaron los trabajos cron.

Más información

Consulta información detallada sobre cómo definir tareas cron en la referencia de cron.yaml.