Azure Functions

Azure   PowerShell

Serverless Computing - Azure Functions

Aunque suene un poco contradictorio, el concepto de Serverless no significa que no hay un servidor, en realidad hace referencia a que no hay ningún servidor del que debemos preocuparnos. Ésta idea se asemeja bastante a lo que es Paas, aunque en realidad es un nuevo concepto que lo lleva a otro nivel.

Básicamente es una abstracción en la que solo debemos preocuparnos de que el código funcione correctamente y no sobre que plataforma (o servidor) se ejecuta. En pocas palabras, Azure Functions nos permite utilizar Azure para ejecutar código permitiendo elegir entre varios lenguajes:

  • Bash
  • Batch
  • C#
  • F#
  • JavaScript
  • PHP
  • PowerShell
  • Python

Ahora bien, no debemos perder de vista que Azure Functions permite ejecutar pequeñas piezas de código (funciones) en la nube. Vamos a considerar su uso para realizar tareas de procesamientos, solicitudes o mantenimiento de archivos logrando como consecuencia integrar sistemas, trabajar con Internet of Things (IoT) o construir APIs o microservicios.

Crear nuestra primera Azure Function

Antes de comenzar a escribir nuestra primer función es necesario contar con una suscripción de Azure, en caso de no contar con una activa les comparto un enlace para que puedan crear una.

Teniendo nuestra suscripción activa vamos a acceder al portal de Azure Functions con las credenciales de Azure para poder comenzar a trabajar:

Azure Functions

Para este ejemplo nombré la función como PacktpubNotifier como consecuencia a un requerimiento que pretendo resolver con Azure Functions y es el siguiente:

La editorial Packtpub todos los días ofrece un libro gratuito, para saber cuál es el libro (en caso de no estar registrados al newsletter) debemos acceder a éste enlace y en el sitio veremos los libros gratuitos de días anteriores así como el libro gratuito del día. Para no revisar el sitio cada día vamos a construir una función que nos notifique cada día que libro gratuito ofrece la editorial Packtpub. La notificación la vamos a realizar por medio de un mail, ya que todos los días la mayoría de nosotros revisa el correo.

Dentro de las regiones vamos a seleccionar la que más nos convenga según nuestros requerimientos. Elegí Brasil sólo para salir de las regiones de US (no me interesa la latencia).

Scheduler

Vamos a seleccionar Create + get started para situarnos en la siguiente pantalla:

Azure Functions

En donde nos aparecen algunas opciones preestablecidas para crear nuestra función. Como nosotros vamos a trabajar con PowerShell seleccionamos Our create your own custom function.

Vamos a seleccionar PowerShell como lenguaje y el template del tipo TimeTrigger. Antes de finalizar el asistente definiremos el nombre de la función:

Azure Functions

Por último debemos seleccionar la periodicidad en la que se va a ejecutar nuestra función. Azure Functions utiliza expresiones CRON para planificar la ejecución de nuestra función. No pretendo profundizar sobre como funciona pero básicamente debemos tener clara la estructura que es la siguiente:

{second} {minute} {hour} {day} {month} {day of the week}

Para el ejemplo, vamos a requerir que la ejecución se realice una vez por día, a las 10:00hs (UTC-03:00):

0 0 13 * * *

Ingresamos la estructura anterior y seleccionamos create:

Schedule

Código

Ahora nos toca desarrollar la parte de código, vamos a utilizar el cmdlet Invoke-WebRequest con el que obtendremos el dato que necesitamos para enviar al mail. Destacar que el comando solamente puede ejecutarse con el parámetro -UseBasicParsing por lo que es necesario manipular los datos de forma más extensa, de la siguiente manera:

#Datos
$web = Invoke-WebRequest -Uri https://www.packtpub.com/packt/offers/free-learning -UseBasicParsing
$texto = ($web.RawContent -split '<div class="dotd-title">' | select -Last 1)
$title = (($texto -split '</h2>' | select -First 1) -split '<h2>' | select -Last 1).trim()
#Credenciales
$user = '[email protected]'
$pass = (ConvertTo-SecureString 'XXXXXXXXXXXXXX' -AsPlainText -Force)
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
#Envío de mail 
$date = Get-Date -Format dd/MM
Send-MailMessage -To vmsilvamolina@gmail.com -From vmsilvamolina@victorsilva.com.uy -Subject "Packtpub: Libro gratis - $date" -Body $title -SmtpServer smtp.office365.com -UseSsl -Credential $cred -Port 587

Azure Functions - Código

Ya con el código ingresado, vamos a guardar los cambios y posteriormente a que se ejecute, para poder obtener como resultado nuestro mail con la información del libro sin necesidad de acceder a la página, utilizando una función simple en Azure.

Happy scripting!

Comments