Pide tu presupuesto ya!

Crear una función de Azure para ejecutar PowerShell en la nube

Azure Functions proporciona una forma eficaz de ejecutar código en la nube sin administrar servidores. Creemos una función de Azure que ejecute PowerShell, perfecta para automatizar tareas o crear aplicaciones sin servidor.

Configuración de los requisitos previos

Primero, necesitamos configurar algunos recursos de Azure. Usaremos PowerShell para crear estos:

1. Cree un grupo de recursos:

New-AzResourceGroup -Name "PowerShellAzFunctionsDemo" -Location "East US"

2. Cree una cuenta de almacenamiento (obligatoria para Azure Functions):

New-AzStorageAccount -ResourceGroupName "PowerShellAzFunctionsDemo" -Name "psazfunctionsdemostorage" -Location "East US" -SkuName "Standard_LRS"

Cada Function App necesita una cuenta de almacenamiento para almacenar el código de función y otro contenido relacionado con la función. estamos usando Estándar_LRS (Almacenamiento localmente redundante) porque es rentable para fines de demostración. En un entorno de producción, podría considerar opciones más redundantes.

3. Cree la aplicación de funciones:

New-AzFunctionApp -Name "PowerShellFunctionsDemo" -ResourceGroupName "PowerShellAzFunctionsDemo" -StorageAccountName "psazfunctionsdemostorage" -Runtime "PowerShell" -RuntimeVersion "7.2" -OSType "Linux" -Location "East US"

Aquí es donde ocurre la magia. Estamos creando una aplicación de funciones, que es el contenedor que albergará nuestras funciones. Estamos especificando PowerShell 7.2 como nuestro tiempo de ejecución para garantizar que nuestros scripts se ejecuten en PowerShell 7.2. Usamos Linux como nuestro tipo de sistema operativo porque generalmente es más rentable y más rápido que Windows.

La aplicación de funciones contiene todas las funciones que usted crea.

Creando la función localmente

Ahora que tenemos nuestros recursos de Azure configurados, creemos la función localmente:

1. Instalar Herramientas principales de funciones de Azure (si aún no está instalado).

2. Cree un nuevo proyecto de función:

func init PowerShellFunctionProject --powershell

3. Veamos qué creó.

gci C:\PowerShellFunctionProject
  • Host.json es un archivo de configuración global que afecta todas las funciones dentro de una aplicación. Configura cosas como registro, tiempo de espera de funciones, enlaces y activadores entre funciones.
  • El configuración.local.json El archivo es un archivo de configuración para el desarrollo local. Por lo general, trabajará en su código de función aquí localmente y luego lo publicará una vez que esté completo.
  • perfil.ps1 – Este es un script de PowerShell que se ejecuta cuando se inicia la aplicación de funciones o se crea un nuevo espacio de ejecución. Se utiliza para tareas de inicialización global, como configurar la autenticación, importar módulos y definir variables disponibles para todas las funciones de la aplicación.
  • requisitos.psd1 – Este archivo de manifiesto de PowerShell enumera las dependencias del módulo de PowerShell para su aplicación de funciones. Especifica qué módulos y versiones deben instalarse automáticamente, asegurando que todas las herramientas necesarias estén disponibles para que sus funciones se ejecuten correctamente.

Pero no hay scripts de PowerShell que invocar. Depende de nosotros crear.

4. Cree una nueva función dentro del proyecto. Para crear eso, necesito crear una subcarpeta dentro de la carpeta del proyecto, que se llamará el nombre de la función.

mkdir C:\PowerShellFunctionProject\PowerShellFunction

5. Crea el run.ps1 guion:

using namespace System.Net

param($Request, $TriggerMetadata)

$name = $Request.Query.Name

$body = "Hello, $name. This HTTP triggered function executed successfully."

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})

Este es el corazón de nuestra función: el código de PowerShell real que se ejecutará. Este es un ejemplo simple que demuestra la entrada y la salida. Cuando la función se activa a través de HTTP (ya que lo configuramos en el archivo JSON de la función), la solicitud HTTP se representará a través del parámetro Solicitud. El parámetro Solicitud contendrá información como el verbo HTTP utilizado, como GET o POST, la consulta y la carga útil o el cuerpo de la solicitud HTTP para solicitudes POST.

El script leerá el parámetro de consulta HTTP Nombre, le asignará la variable de nombre y luego lo usará en una cadena simple.

Finalmente, la función generará información a través de HTTP, por lo que debemos aplicar un enlace de salida. El enlace de salida “vinculará” el flujo de salida del script de PowerShell a la función para enviarlo de vuelta a través de una respuesta HTTP. Para convertir la salida de PowerShell en una respuesta HTTP que la función comprenda, debemos crear un HttpResponseContext objeto con dos propiedades:

  1. StatusCode: Establecido en HTTP 200 OK, lo que indica una solicitud exitosa.
  2. Body: El mensaje de saludo que construimos anteriormente.

Esta estructura permite a Azure Functions formatear correctamente la respuesta HTTP que se devolverá al cliente.

5. Ahora, creemos el función.json archivo.

{
  "bindings": [
    {
      "name": "Request",
      "methods": [
        "get",
        "post"
      ],
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "type": "http",
      "name": "Response",
      "direction": "out"
    }
  ]
}

Este función.json El archivo es crucial. Define los enlaces para nuestra función. Los enlaces especifican cómo se activa y cómo genera datos.

  • Estamos configurando un activador HTTP que responde a solicitudes GET y POST
  • Esta función utilizará autenticación anónima para que podamos consultar la URL a la que estará expuesta sin proporcionar ninguna credencial.

La función devolverá una respuesta HTTP y se llamará $Response variable dentro del script de PowerShell que ejecutaremos.

Esto debe guardarse en la misma carpeta que el run.ps1 guion.

6. Ahora, navegue primero hasta la carpeta de funciones.

cd C:\PowerShellFunctionProject

7. Y vea si la función puede iniciarse.

Al desarrollar Azure Functions, primero debe publicarlo localmente y luego publicarlo cuando haya terminado. Puede ejecutar una función localmente ejecutando func start.

Ah, otra dependencia. ¿No te encantan esos? Instalemos el SDK de .NET Core.

start https://www.microsoft.com/net/download

Todo hecho. Demos otra oportunidad. Pero primero, necesito reiniciar mi consola PowerShell nuevamente e intentarlo nuevamente.

…y nos topamos con otro error. El rojo que me llama la atención es “no se pudo iniciar un nuevo trabajador de lenguaje para PowerShell en tiempo de ejecución”. Un trabajador en Azure Functions es el host que ejecuta PowerShell. Como estamos ejecutando localmente, esa es mi máquina local. Comprobemos el archivo JSON de configuración local.

code C:\PowerShellFunctionProject\local.settings.json

De forma predeterminada, configuró la versión de tiempo de ejecución en 7.2. Comprobemos la versión instalada en mi máquina.

Ah, ahí está el problema. Estoy en 7.4. Cambiemos eso.

Ahora, intentémoslo de nuevo.

Es mucho mejor. No hay ningún rojo feo. Ahora tenemos una URL con la que podemos activar el script. Copiemos esa URL y abramos otra consola.

Invoke-RestMethod -Uri http://localhost:7071/api/PowerShellFunction

lo usaré Invoke-RestMethod para consultar el servidor web local y ver qué sucede.

¡Hurra! Se muestra el texto de PowerShell. Pero espera, no hay nada después de “Hola”.

Invoke-RestMethod -Uri <http://localhost:7071/api/PowerShellFunction> -Body @{Name="Adam"}

Pasemos el cuerpo HTTP con una clave de Nombre que está mirando el script.

¡Éxito!

gc C:\PowerShellFunctionProject\PowerShellFunction\run.ps1

Puedes ver donde $Request.Query.Name está en el guión aquí.

Ahora sabemos que la función fue activada por la solicitud HTTP GET que acabamos de ejecutar en el servidor web local. La función se ejecutó, ejecutó el script de PowerShell y luego envió la salida del script de PowerShell a través de una respuesta HTTP.

Publicación de la función de Azure

Nuestra función está completa y probada localmente; ahora publiquémoslo en Azure y veamos si funciona allí también. Primero déjame asegurarme de estar en el directorio de mi proyecto de función.

cd C:\PowerShellFunctionProject
Get-AzFunctionApp -Name "PowerShellFunctionsDemo" -ResourceGroupName "PowerShellAzFunctionsDemo"

Permítanme verificar el nombre de la aplicación de funciones que creé anteriormente.

Está bien. Es PowerShellFunctionsDemo.

func azure functionapp publish PowerShellFunctionsDemo

Ahora puedo usar el binario func nuevamente y publicar la función especificando el nombre de la aplicación de funciones a la que enviar la función local.

Este proceso comprime todos los archivos en esa carpeta de funciones, los carga en la cuenta de almacenamiento que aloja la aplicación de funciones y luego los implementa en una pequeña aplicación web.

Se ve bien. ¡Es hora de la prueba final!

Invoke-RestMethod -Uri 'https://powershellfunctionsdemo.azurewebsites.net/api/powershellfunction' -Body @{Name="Adam"}

¡Éxito! Ahora se ejecuta exactamente igual que en mi máquina local. ¡Nuestra función Azure está implementada y disponible!

Conclusión

¡Felicidades! Ha creado correctamente una función de Azure que ejecuta código de PowerShell en la nube. Esto abre un mundo de posibilidades para la automatización sin servidor y la ejecución de scripts escalables.

Recuerde, esto es sólo una muestra de lo que ocurre. Azure Functions puede hacer mucho más, incluido el manejo de diferentes tipos de desencadenadores (como temporizadores o mensajes en cola) y la integración con otros servicios de Azure. ¡Feliz scripting en la nube!

Written by

Leave a comment