Pide tu presupuesto ya!

Cree su primera función de PowerShell Azure: una guía paso a paso

Creemos una función de Azure para ejecutar PowerShell en la nube. En esta demostración, crearemos una función de Azure sencilla activada por HTTP que ejecuta un script de PowerShell.

Configuración de requisitos previos

Empezaremos desde cero, suponiendo que ya tenga una suscripción activa a Azure. Primero configuraremos todos los requisitos previos de la función con PowerShell. Más adelante, usaremos una herramienta de línea de comandos para realizar la función real de Azure.

Como siempre, crearé un grupo de recursos separado solo para poder limpiar todo esto una vez que hayamos terminado.

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

Ahora, creemos una cuenta de almacenamiento. Pero antes de que eso suceda, necesitarás Arizona.Módulo de almacenamiento instalado. Instalemos el módulo Az.Storage. Mientras estamos en eso, sé que también necesitaré el módulo Az.Functions, así que lo incluiré.

Install-Module Az.Storage,Az.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 utilizando “Standard_LRS” (almacenamiento localmente redundante) porque es rentable para nuestros fines de demostración. En un entorno de producción, podría considerar opciones más redundantes.

Crear la aplicación de funciones

A continuación, crearemos nuestra aplicación de funciones. La aplicación de funciones contiene todas las funciones que usted crea.

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.

Me dice que no utilicé el parámetro FunctionsVersion, lo cual está bien. Al momento de escribir este artículo, la v4 es la versión recomendada para todas las funciones.

Desafortunadamente, no puedes realizar todo este proceso solo con PowerShell. Debes usar Microsoft Herramientas principales de funciones de Azure. Para obtenerlo, tendré que consultar un documento de ayuda de Microsoft para descargarlo e instalarlo.

start 'https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-powershell?tabs=windows%2Cazure-cli%2Cbrowser'

Ahora necesito reiniciar mi consola PowerShell para que pueda ver los archivos EXE de la herramienta en la ruta de la computadora.

Primero creemos el proyecto de función. El paquete de herramientas RunTime requiere que primero cree un proyecto al que luego agrega funciones.

Primero llegaré a la raíz de C para que la herramienta pueda crear el proyecto de función allí.

func init PowerShellFunctionProject --powershell

Puedo crear un proyecto de funciones con el func dominio. Este comando crea algunos archivos necesarios que la función necesita una vez que la publicamos en Azure. Observe que estoy especificando el tiempo de ejecución como PowerShell. Aquí también puedes elegir opciones como Python.

Veamos qué creó.

gci C:\PowerShellFunctionProject

Algunos archivos.

  • 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.

Creando las funciones de Azure

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

mkdir C:\PowerShellFunctionProject\PowerShellFunction

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

code C:\PowerShellFunctionProject\PowerShellFunction\run.ps1

Y luego necesito crear el script llamado ejecutar.ps1 en la carpeta de funciones.

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 y le asignará la variable de nombre y luego la 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. Cuerpo: el mensaje de saludo que construimos anteriormente.

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

Ahora, creemos el función.json archivo. Abriré una nueva pestaña y crearé el archivo function.json.

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

Este archivo function.json 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 script run.ps1.

Ahora, volvamos a mi consola. Primero navegaré a mi carpeta de funciones.

cd C:\PowerShellFunctionProject

Y ver si puedo iniciar la función.

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.

Y ahora, intentémoslo de nuevo.

…y nos topamos con otro error. Al desplazarme un poco hacia arriba, 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

Parece que la versión de ejecución está configurada en 7.2 de forma predeterminada. 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

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 Name que el guión está mirando.

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.

Nuestra función está completa y probada localmente; ahora publiquémoslo en Azure y veamos si funciona allí también.

cd C:\PowerShellFunctionProject

Primero déjame asegurarme de estar en el directorio de mi proyecto de función.

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!

Written by

Leave a comment