Serverless y PS – Ejecutar PowerShell en Azure Functions

Sin duda la palabra serverless (una palabra un poco controvertida) está pegando fuerte en los últimos tiempos y parece que ha llegado para quedarse. Si bien este concepto está muy ligado a la parte del desarrollo, desde de sistemas también podemos sacarle mucho jugo. En la entrada de hoy veremos cómo ejecutar PowerShell en Azure Functions, la plataforma serverless de Microsoft.

Ejecutar PowerShell en Azure Functions

Conociendo serverless y Azure Functions

Antes de empezar con el how-to propiamente dicho creo que es importante que tengamos clara la base de todo esto.

Serverless es el «palabro» elegido por la industria para definir un servicio en el que el desarrollador se desentiende del servidor donde se ejecuta su código. En un servicio serverless el desarrollador simplemente copia su código y el proveedor de servicios es el encargado de aprovisionar la infraestructura necesaria para que éste funcione, escale y se mantenga disponible.

No me gusta particularmente la palabra serverless pues puede llevar al error de pensar que realmente no existe un «servidor» que ejecute el código. Lo que nos tiene que quedar claro es que éste no desaparece, sino que pasa a ser transparente para el usuario.

Azure Functions es el servicio serverless de Microsoft, un servicio que nos va a permitir ejecutar funciones o scripts de PowerShell en «la nube» de forma muy sencilla sin tener que desplegar un servidor para ello.

Creando la Azure Function

Ahora que ya conocemos un poco más de serverless y de las Azure Functions vamos a explorar un poco el servicio creando una función de prueba.

Accediendo a Azure

Lo primero que deberemos hacer para empezar con Azure Functions será entrar en nuestra cuenta de Azure. Si no dispones de una puedes crearla de forma gratuita desde su página web. Con tu nueva cuenta dispondrás de:

  • 12 meses de algunos servicios de forma gratuita.
  • 170€ de crédito para usar con cualquier servicio.
  • Muchos servicios de forma gratuita siempre.

En nuestro caso con Azure Functions nos valdremos de su tier gratuito, que es más que suficiente para hacer toda clase de pruebas con él.

Creando nuestra primera Azure Function App

Una vez logeados en nuestra cuenta de Azure podemos proceder a crear nuestra Azure Function App (el contenedor que hospedará nuestras funciones). Para ello nos dirigiremos a su respectivo apartado en el menú lateral izquierdo:

Function App en Azure

Posteriormente pulsaremos sobre el botón Crear Function App y rellenaremos sus campos:

Configuración de Function App

Repasemos los campos configurados:

  • Nombre de la aplicación: El nombre de la aplicación, que a su vez definirá la URL de la misma.
  • Suscripción: Seleccionar cuál de nuestros planes de suscripción utilizaremos. Como esta es una cuenta nueva utilizamos la Evaluación gratuita.
  • Grupo de recursos: Dejamos que nos genere un nuevo grupo de recursos para la aplicación (más sobre los grupos de recursos aquí).
  • OS: Seleccionamos Windows.
  • Plan de hospedaje: Dejamos marcado plan de consumo para utilizar el pago por ejecución (no vamos a pagar nada puesto que utilizaremos el tier gratuito).
  • Ubicación: Seleccionamos una ubicación cercana a nosotros.
  • Pila de tiempo de ejecución: Elegimos .NET para ejecutar PowerShell.
  • Storage: Marcamos la creación de un storage nuevo para nuestra aplicación.

Después de rellenar los campos pulsaremos sobre el botón Crear y esperaremos hasta que la aplicación se cree. Una vez creada deberíamos ver algo así en el apartado Function App:

Function App creada

Por último, antes de pasar a crear la función en si, deberemos cambiar a la versión 1 el runtime de nuestra Funcion App, puesto que la versión 2 no soporta la ejecución de PowerShell. Para ello pincharemos sobre el nombre de nuestra Function App y posteriormente en Configuración de Function App.

Configuración de Function App

Y en Versión en tiempo de ejecución marcaremos ~1.

Versión de Function App
Creando nuestra función de PowerShell en Azure Functions

Ahora que tenemos el entorno de ejecución creado y configurado podemos pasar a crear la función en si. Para ello pincharemos sobre el botón + de al lado de Funciones y posteriormente pulsaremos sobre Crear su propia función personalizada.

Crear nueva Azure Function

En Elegir una plantilla a continuación:

  • Habilitamos la Compatibilidad de lenguaje experimental para poder utilizar PowerShell. (PowerShell en Azure Functions se encuentra en estado experimental, por lo que no se deberían poner cargas críticas en éste servicio)
  • Seleccionamos HTTP trigger como modo de ejecución de nuestra función para esta prueba.
Configuración de Azure Function

En el menú de creación de la función seleccionamos PowerShell como lenguaje y le damos nombre a la función.

Configuración de Azure Function 2

Una vez finalizada la creación ya deberíamos ver nuestra flamante nueva función de prueba:

Azure Function creada

Entendiendo el script de prueba

El script de prueba que se nos proporciona nos puede ayudar a entender de una forma fácil algunas de las particularidades de la ejecución de PowerShell en Azure Functions.

Básicamente lo que hace este pequeño script será buscar un parámetro Name en nuestra petición (tanto si es GET como si es POST) y devolvernos un string con Hello $name. Vamos a examinarlo:

# POST method: $req
$requestBody = Get-Content $req -Raw | ConvertFrom-Json
$name = $requestBody.name

# GET method: each querystring parameter is its own variable
if ($req_query_name) 
{
    $name = $req_query_name 
}

Out-File -Encoding Ascii -FilePath $res -inputObject "Hello $name"
  • Líneas 1-3: Parte del script orientada a peticiones POST.
    • 2: Obtenemos el cuerpo de la petición contenido en la variable $req y lo convertimos de json a un objeto. En Azure Functions el cuerpo de la petición POST siempre vendrá contenido en esta variable.
    • 3: Obtenemos la propiedad name de la petición.
  • Líneas 5-9: Parte del script orientada a peticiones GET.
    • 6: Determinamos si existe la variable $req_query_name.
      • En Azure Functions las propiedades que pasemos mediante GET generan una variable automática $req_query_nombrepropiedad. Esto quiere decir que si lanzamos una query con una propiedad «blog» ésta será accesible en nuestro script con $req_query_blog.
    • 8: De existir la variable la almacenamos en $name para posteriormente devolverla en nuestra string.
  • Línea 11: Devolvemos nuestra string añadiendo su contenido al archivo de salida ubicado en la ruta de la variable $res.
    • En Azure Functions $res es una variable especial que apunta al archivo utilizado para la salida de nuestra función.

Todo esto puede parecer muchas cosas a tener en cuenta pero básicamente hablamos de 3:

  • Si queremos procesar solicitudes POST nos valdremos de $req para obtener los parámetros.
  • En caso de querer procesar solicitudes GET nos valdremos de $req_query_nombredelparametro para obtener el parámetro.
  • Siempre devolveremos el resultado de nuestro script mediante $res.

Ejecutando PowerShell en Azure Functions

Por último, ahora que ya tenemos nuestra Function App y nuestra función de PowerShell podemos probarla. Para ello nos valdremos de Invoke-RestMethod, el cmdlet de referencia para interactuar con APIs REST desde PowerShell.

El primer paso será obtener la URI completa desde la que invocar nuestra función. Desde la vista de nuestra función pulsaremos sobre </> Obtener la dirección URL de la función:

URI de la función

Una vez copiada lo primero que haremos será guardarla en una variable:

$Funcion = "https://sobrebitstest.azurewebsites.net/api/PSSobrebits?code=dKFWt5Ew..."

Y ahora vamos a hacer algunas consultas sobre ella:

Invocar script de PowerShell en Azure Functions

Repasemos el resultado de los comandos:

  • En la primera ejecución no añadimos a la URI ningún parámetro, con lo que nuestro script no puede concatenar ningún nombre a «Hello».
  • En la segunda ejecución añadimos un nombre a la petición añadiéndolo a la URI y, esta vez sí, se concatena a «Hello».
  • En la tercera ejecución vemos como para este script el funcionamiento es el mismo tanto con POST como con GET.

Resumen

En la entrada de hoy hemos podido ver como sin desplegar ningún tipo de servidor tenemos código de PowerShell ejecutándose bajo demanda en Azure. Los usos que le podemos dar son muchos y en próximas entradas espero traeros alguno.

Os invito a que exploréis esta forma de ejecutar PowerShell puesto que abre un abanico inmenso de posibilidades y, sin duda, es una forma sencilla de acercarnos al serverless desde una tecnología que todos conocemos.

¡Nos leemos pronto!

Deja un comentario