Creación y prueba de una función de Azure sencilla localmente con Visual Studio

Completado

Los usuarios pueden escribir, depurar e implementar una función de Azure desde Azure Portal. Sin embargo, es posible que no sea adecuado escribir funciones directamente en un entorno de producción, ensayo o prueba. Por ejemplo, escribir pruebas unitarias automatizadas para Azure Functions o utilizar la implementación a petición de Azure Functions en las aplicaciones en Azure Functions. Normalmente, los desarrolladores prefieren usar un editor de código y herramientas de desarrollo en lugar del entorno que ofrece Azure Portal. Visual Studio le permite desarrollar y administrar código de Azure Functions mediante otro código y servicios en un solo proyecto.

En el escenario en línea de relojes de lujo, los desarrolladores ya están familiarizados con Visual Studio 2022. Por lo tanto, se decide usar Visual Studio como entorno de desarrollo principal para la creación de Azure Functions. Además, Visual Studio ofrece un excelente entorno para probar sus funciones localmente antes de implementarlas en Azure.

En esta unidad, aprenderá a usar las herramientas disponibles en Visual Studio para compilar y probar una Azure Function en el equipo local.

Importante

En este artículo se admiten las funciones de la biblioteca de clases .NET que se ejecutan en proceso con el entorno en tiempo de ejecución. Las funciones de C# también se pueden ejecutar fuera de proceso y aisladas del entorno de ejecución de Functions. El modelo de proceso de trabajo aislado es la única manera de ejecutar versiones que no son LTS de aplicaciones de .NET Framework y .NET en versiones actuales del runtime de Functions. Para más información, vea Funciones de proceso de trabajo aislados de .NET.

Modificación de la instalación de Visual Studio

En primer lugar, vamos a configurar Visual Studio con las herramientas web y en la nube que necesita para el entorno de desarrollo.

  1. Con Visual Studio 2022 instalado localmente, abra el Instalador de Visual Studio y, en Visual Studio Community 2022, seleccione Modificar.

    Captura de pantalla del Instalador de Visual Studio con Modificar resaltado.

  2. Se abrirá la página Modificación: Visual Studio.

    Captura de pantalla de la pestaña de modificación de cargas de trabajo en Visual Studio Community 2022 con ASP.NET y el desarrollo web y el desarrollo de Azure resaltados.

  3. En la pestaña Cargas de trabajo, seleccione las casillas ASP.NET y desarrollo web y Desarrollo de Azure, y después Modificar.

  4. En el cuadro de diálogo de comprobación, seleccione . Aparece la página del Instalador de Visual Studio y muestra el progreso de los paquetes que se están instalando.

Extensión Azure Functions Tools para Visual Studio

Azure Functions Tools es una extensión de Visual Studio que permite crear, probar e implementar Azure Functions en el entorno de desarrollo local. Para crear rápidamente una aplicación de Azure Function, esta extensión proporciona una plantilla para compilar y posteriormente implementar una función de Azure directamente en Azure desde Visual Studio.

La extensión Azure Functions and Web Jobs Tools se incluye en Visual Studio 2022.

Aplicación de función de Azure

Una aplicación de funciones hospeda una o varias funciones. Proporciona el entorno y el runtime del código de función.

Una función se desencadena mediante un evento, en lugar de llamarse directamente desde una aplicación. Especifique el tipo de evento que desencadena cada función en la aplicación de funciones de Azure. Entre los eventos disponibles se incluyen:

  • Desencadenador de blobs. Este tipo de función se ejecuta cuando se carga o se actualiza un archivo en Azure Blob Storage.
  • Desencadenador de centro de eventos. Un desencadenador de Event Hubs ejecuta la función cuando un centro de eventos recibe un mensaje.
  • Desencadenador de Azure Cosmos DB. Este desencadenador se ejecuta cuando un documento se agrega o modifica en una base de datos de Azure Cosmos DB. Puede utilizar este desencadenador para integrar Azure Cosmos DB con otros servicios. Por ejemplo, si un documento que representa el pedido de un cliente se agrega a una base de datos, puede utilizarse un desencadenador para enviar una copia del pedido a una cola para su procesamiento.
  • Desencadenador de HTTP. Un desencadenador de HTTP ejecuta la función cuando se produce una solicitud HTTP en una aplicación web. También puede utilizar este desencadenador para responder a webhooks. Un webhook es una devolución de llamada que tiene lugar cuando se modifica un elemento hospedado por un sitio web. Por ejemplo, se puede crear una función que se activa mediante un webhook desde un repositorio de GitHub cuando cambia un elemento del repositorio.
  • Desencadenador de cola. Este desencadenador inicia la función cuando se agrega un nuevo elemento a una cola de Azure Storage.
  • Desencadenador de cola de Service Bus. Este desencadenador ejecuta la función cuando se agrega un nuevo elemento a una cola de Azure Service Bus.
  • Desencadenador de tema de Service Bus. Este desencadenador ejecuta la función en respuesta a un nuevo mensaje que llega sobre un tema de Service Bus.
  • Desencadenador de temporizador. Este evento ejecuta la función a intervalos regulares, según la programación que defina.

Captura de pantalla en la que se muestran los desencadenadores de función de Azure disponibles, con el desencadenador de HTTP resaltado.

En la tabla siguiente se muestra el nivel más alto de .NET Core o .NET Framework que puede usar con una versión específica de Functions.

Versiones del entorno en tiempo de ejecución de Functions En proceso Proceso de trabajo aislado
Functions 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Functions 1.x .NET Framework 4.8 N/D

Una aplicación de funciones de Azure almacena información de administración, código y registros en Azure Storage. Para almacenar estos datos, cree una cuenta de almacenamiento. La cuenta de almacenamiento debe admitir Azure Blob, Queue, Files y Table Storage; use una cuenta general de Azure Storage con esta finalidad. Especifique la cuenta de almacenamiento que se va a usar para la función mediante el cuadro de diálogo mostrado anteriormente.

Una función puede realizar operaciones confidenciales o con privilegios. Una función desencadenada mediante una solicitud HTTP podría exponerse públicamente. Tal vez tenga que limitar la posibilidad de ejecutar esta función a grupos seleccionados de usuarios. Protege una función especificando los derechos de acceso necesarios para desencadenar la función. Una función desencadenada mediante una solicitud HTTP admite tres niveles de derechos de acceso:

  • Anónimo. No se requiere autenticación y cualquier usuario puede desencadenar la función.
  • Función. La solicitud HTTP debe proporcionar una clave que habilite Azure Functions Runtime para que la autorice. Cree esta clave por separado y puede mantenerla mediante Azure Portal.
  • Administrador. Similar a Función. El usuario debe especificar una clave con la solicitud HTTP que desencadena la función. La diferencia es que la clave es una clave de administrador. Esta clave se puede utilizar para acceder a cualquier función de la aplicación de función. Al igual que con una clave de función, cree esta clave por separado.

Si va a crear una función desencadenada por eventos que no sean las solicitudes HTTP, tiene que proporcionar una cadena de conexión y otros detalles necesarios para que la aplicación de función acceda al recurso que desencadena el evento. Por ejemplo, si va a escribir una función desencadenada por un evento de Blob Storage, debe especificar la cadena de conexión de la cuenta de Blob Storage correspondiente.

Estructura de una función de Azure

Una función de Azure se implementa como clase estática. La clase proporciona un método estático y asincrónico denominado Run, que actúa como punto de entrada de la clase.

Los parámetros pasados al método Run proporcionan el contexto del desencadenador. Si es un desencadenador de HTTP, la función recibe un objeto HttpRequest. Este objeto contiene el encabezado y el cuerpo de la solicitud. Se puede acceder a los datos de la solicitud mediante las mismas técnicas disponibles en cualquier aplicación HTTP. Los atributos aplicados a esta función especifican los requisitos de autorización (Anónimo, en este caso) y las operaciones de HTTP a las que responde la función (GET y POST).

El ejemplo de código siguiente generado por Visual Studio examina la cadena de consulta que se proporciona como parte de la dirección URL de la solicitud y busca un parámetro denominado name. El código también usa un objeto StreamReader para deserializar el cuerpo de la solicitud e intenta leer en la solicitud el valor de una propiedad también denominada name. Si name se encuentra en la cadena de consulta o en el cuerpo de la solicitud, el valor de name se devuelve en la respuesta. De lo contrario, la función genera una respuesta de error con el mensaje: Pase un nombre en la cadena de consulta o en el cuerpo de la solicitud.

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

La función devuelve un valor que contiene los datos de salida y los resultados, encapsulados en un objeto IActionResult. El valor se devuelve en el cuerpo de la respuesta HTTP para la solicitud.

Los distintos tipos de desencadenadores reciben distintos parámetros de entrada y tipos de valor devuelto. El ejemplo siguiente muestra el código generado para un desencadenador de Blob. En este ejemplo, el contenido del blob se devuelve a través de un objeto Stream y también se proporciona el nombre del blob. El desencadenador no devuelve ningún dato; su propósito es leer y procesar los datos en el blob con nombre.

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

En todos los casos, una función pasa un parámetro un ILogger. La función puede usar este parámetro para escribir mensajes de registro, que la aplicación de función escribe en el almacenamiento para su posterior análisis.

Una función también contiene metadatos que especifican el tipo del desencadenador, los requisitos de seguridad y cualquier otra información específica. Puede modificar los metadatos mediante HttpTrigger, BlobTrigger u otros atributos de desencadenador, tal y como se muestra en los ejemplos. El atributo FunctionName que precede a una función es un identificador de la función que utiliza la aplicación de funciones. Este nombre no tiene que ser el mismo que el nombre de la función, pero es recomendable mantenerlos sincronizados para evitar confusiones.

Prueba local de una aplicación de funciones de Azure

Puede usar el depurador de Visual Studio para compilar y probar localmente una aplicación de funciones de Azure. Para iniciar el depurador, presione F5 o seleccione Iniciar depuración en el menú Depurar. Se inicia la versión local de Azure Function Runtime. Las funciones están disponibles para las pruebas. En el ejemplo se muestra el runtime que hospeda Function1, la función desencadenada por un evento HTTP. La dirección URL indica el punto de conexión al que está asociada la función.

Captura de pantalla que muestra el entorno de ejecución de Azure Function: ejemplo 1.

Si abre un explorador web y visita esta dirección URL, desencadena la función. En la imagen siguiente se muestra la respuesta generada por una solicitud HTTP GET que no incluye un cuerpo. Puede ver el mensaje generado por el código que devuelve el objeto BadRequestObjectResult desde la función.

Captura de pantalla en la que se muestra el entorno de ejecución de Azure Function.

Si proporciona una cadena de consulta que incluye un parámetro name, la función lee y procesa el valor.

Captura de pantalla que muestra el entorno de ejecución de Azure Function: ejemplo 2.

Mientras se ejecuta el código, verá que aparecen mensajes de seguimiento en la ventana de Azure Function Runtime. Puede usar las características de depuración estándar de Visual Studio si tiene que establecer puntos de interrupción y examinar el flujo de control en una función.