CRON en Azure App Service (Websites)

Si estáis al día con Microsoft Azure, sabréis que Azure Websites pasó a llamarse Azure App Service, el servicio PaaS donde se integra la plataforma para aplicaciones móviles y web.  Las ventajas de hospedar nuestra aplicación web aquí versus la tradicional máquina virtual son múltiples y muy evidentes:

  • Microsoft se ocupa de la seguridad y actualización del sistema operativo, servidores web y los runtimes (PHP, Java,  .NET, Python…) que se ejecutan sobre él.
  • Podemos escalar el número de instancias dedicadas a servir nuestra aplicación de forma dinámica y en función de la demanda, tanto ascendente como descendente.
  • Soporte de integración continua y slots de deployment, lo que nos permite disponer de un área de producción y otra de pre-producción e intercambiarlas.
  • Sistema de copia de seguridad.
  • Sistema de monitorización.

Sin embargo, hay una parte del sistema operativo que sí que podemos echar en falta cuando nos lanzamos a hospedar nuestra aplicación en Azure App Service: el CRON (UNIX) o bien el Programador de Tareas (Windows).

Conocidas aplicaciones LAMP como podría ser WordPress usan CRON para programar la ejecución de tareas de mantenimiento, como por ejemplo la verificación de actualizaciones de los distintos plugins y themes o la publicación de un post programado. En muchas ocasiones, nuestra aplicación puede llevar integrado un CRON que se ejecuta con las visitas de nuestros usuarios al propio sitio web, cosa que si bien suple la necesidad de un programador de tareas a nivel de sistema operativo, se puede convertir en un problema si nuestra aplicación tiene un tráfico muy denso, ocasionando un importante overhead de consumo de recursos en el servidor.

Ejemplo: creando un Azure WebJob para el CRON de WordPress

Para solucionar este problema en Azure App Service, disponemos de Azure WebJobs. Ten en cuenta que para Azure soporte lo que vamos a contar aquí, es indispensable habilitar Always On en la configuración de nuestro App Service.

Hacer uso del mismo es bastante sencillo. En primer lugar deberemos crear un script para ejecutar de forma programada, el cual puede ser un ejecutable de línea de comandos (.cmd, .bat, .exe), PowerShell (.ps1), bash (.sh), PHP (.php), Python (.py), NodeJS (.js) o Java (.jar).

En el caso del CRON de WordPress voy a crear un sencillo archivo BAT con la siguiente línea:

Ya sabemos lo que queremos ejecutar, así que ahora nos toca programar cuándo queremos ejecutarlo. Para ello creamos un archivo llamado settings.job, que tendrá formato JSON con un único atributo schedule cuyo valor será una expresión cron. Hay una explicación estupeda aquí, que viene a decirnos que una expresión CRON nos permite especificar una programación recurrente de forma compacta. A groso modo:

  • Tiene el formato: {segundos} {minutos} {horas} {días} {meses} {días de la semana}
  • Los operadores soportados son: , – * /
  • Cada campo puede tener un valor específico (1), un rango (1-10), un set de valores (1,2,3), todos los valores (*), un intervalo (/2 equivale a 0,2,4,6,…) o una mezcla de todas estas formas.
  • Ten en cuenta que un valor representa un punto muy concreto en el tiempo. Por ejemplo, “0 15 * * * *” significa el minuto 15 y no cada 15 minutos.

Aquí podemos encontrar algunos ejemplos de expresiones CRON:

Ahora que conocemos la sintaxis, podemos volver a nuestro archivo settings.job y poner la programación que queramos, digamos que queremos ejecutar la tarea cada 15 minutos de forma continuada. El aspecto sería el siguiente:

Hecho esto empaquetamos wp-cron.bat y settings.job en un archivo ZIP y ya estamos listos para crear la tarea programada en Azure.

Creando la tarea programada en Azure App Service

Sólo tenemos que acceder a nuestra suscripción de Azure, ir a nuestra aplicación en App Service y desplegar la configuración de WebJobs.

image

Ahora debemos agregar nuestro webjob y… sí, aquí viene la parte confusa: en how to run hay que seleccionar On Demand. La configuración que va implícita en el settings.job hara que a pesar de tener esto especificado se ejecute de forma programda. Si pasáis el ratón por la (i) de ayuda se vuelve más confuso, ya que nos comenta que los WebJobs programados estarán disponibles en el futuro, pero ¡en realidad los tenemos ya disponibles!

image

Con el webjob creado, ya podemos verlo en la tabla con un enlace al log de ejecución:

image

Los webjobs dados de alta y su programación se pueden consultar también bajo la consola de Kudu, en la URL https://<tudominio>.scm.azurewebsites.net/api/webjobs, sustituyendo <tudominio> por el nombre de la implementación.

Deshabilitando el CRON integrado de WordPress

Como hemos tomado este ejemplo con WordPress, no sería justo acabar el artículo sin explicar cómo deshabilitamos su CRON integrado, ya que hemos pasado a configurarlo de forma más eficiente en Azure y ya no dependemos de las visitas a nuestro sitio web para su ejecución.

Para ello buscamos el archivo wp-config.php y agregamos la siguiente línea:

Es una modificación tan simple que la podemos llevar a cabo desde Visual Studio Online.

Y con esto eliminamos uno de los posibles stoppers a la hora de llevar la implementación de nuestra aplicación a Azure App Service. ¡Espero que os resulte ilustrativo!

Happy AppServicing!

Enlace relacionado: Documentación oficial de Azure para la ejecución de tareas en segundo plano

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *