Tutorial: Introducción a los desencadenadores y enlaces de Azure Functions en Azure Cache for Redis

En este tutorial se muestra cómo implementar desencadenadores básicos con Azure Cache for Redis y Azure Functions. Le guiará a través del uso de Visual Studio Code (VS Code) para escribir e implementar una función de Azure en C#.

En este tutorial aprenderá a:

  • Configurar las herramientas necesarias.
  • Configure y conéctese a una caché.
  • Cree una función de Azure e implemente código en ella.
  • Confirme el registro de desencadenadores.

Requisitos previos

Configuración de una instancia de Azure Cache for Redis

Cree una nueva instancia de Azure Cache for Redis mediante Azure Portal o la herramienta de la CLI preferida. En este tutorial se usa una instancia de C1 estándar, que supone un buen punto de partida. Use la guía de inicio rápido para empezar.

Captura de pantalla de la creación de una memoria caché en Azure Portal.

La configuración predeterminada debería ser suficiente. En este tutorial se usa un punto de conexión público como demostración, pero se recomienda que use un punto de conexión privado para todo lo que esté en producción.

La creación de la memoria caché puede tardar unos minutos. Puede pasar a la sección siguiente mientras finaliza el proceso.

Configurar Visual Studio Code

  1. Si aún no ha instalado la extensión de Azure Functions para VS Code, busque Azure Functions en el menú EXTENSIONES y seleccione Instalar. Si no tuviera instalada la extensión de C#, instálela también.

    Captura de pantalla de las extensiones necesarias instaladas en VS Code.

  2. Vaya a la pestaña Azure. Inicie sesión con su cuenta de Azure.

  3. Para almacenar el proyecto que está compilando, cree una nueva carpeta local en el equipo. En este tutorial se usa RedisAzureFunctionDemo como ejemplo.

  4. En la pestaña Azure, cree una nueva aplicación de funciones seleccionando el icono de rayo de la esquina superior derecha de la pestaña Área de trabajo.

  5. Seleccione Crear función....

    Captura de pantalla que muestra el ícono para agregar una nueva función desde VS Code.

  6. Seleccione la carpeta que creó para iniciar la creación de un nuevo proyecto de Azure Functions. Recibirá varios mensajes en pantalla. Seleccione:

    • C# como lenguaje.
    • .NET 8.0 LTS aislado como runtime de .NET.
    • Omitir por ahora como plantilla de proyecto.

    Si no tiene instalado el SDK de .NET Core, se le pedirá que lo instale.

    Importante

    En el caso de las funciones de .NET, se recomienda usar el modelo de trabajo aislado en lugar del modelo en proceso. Para ver una comparación de los modelos de trabajo en proceso y aislado, consulte Diferencias entre el modelo de trabajo aislado y el modelo en proceso para .NET en Azure Functions. En este ejemplo se usa el modelo de trabajo aislado.

  7. Confirme que el nuevo proyecto aparece en el panel EXPLORADOR.

    Captura de pantalla en un área de trabajo de VS Code.

Instalación del paquete NuGet necesario

Debe instalar Microsoft.Azure.Functions.Worker.Extensions.Redis, el paquete NuGet de la extensión Redis que permite que se usen notificaciones de espacio de claves de Redis como desencadenadores en Azure Functions.

Para instalar este paquete, vaya a la pestaña Terminal en VS Code y escriba el siguiente comando:

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Redis --prerelease

Nota:

El paquete Microsoft.Azure.Functions.Worker.Extensions.Redis se usa para las funciones de proceso de trabajo aislado de .NET. En su lugar, las funciones de .NET en proceso y todos los demás lenguajes usarán el paquete Microsoft.Azure.WebJobs.Extensions.Redis.

Configuración de la memoria caché

  1. Vaya a la instancia de Azure Cache for Redis recién creada.

  2. Vaya a la caché de Azure Portal y, a continuación, haga lo siguiente:

    1. En el menú de recursos, seleccione Configuración avanzada.

    2. Desplácese hacia abajo hasta el cuadro notify-keyspace-events y escriba KEA.

      KEA es una cadena de configuración que habilita las notificaciones del espacio de claves para todas las claves y eventos. Para obtener más información sobre las cadenas de configuración del espacio de claves, consulte la documentación de Redis.

    3. Seleccione Guardar en la parte superior de la ventana.

    Captura de pantalla de la configuración avanzada de Azure Cache for Redis en el portal.

  3. Seleccione Claves de acceso en el menú de recursos y, a continuación, anote o copie el contenido del cuadro Cadena de conexión principal. Esta cadena se usa para conectarse a la caché.

    Captura de pantalla que muestra la cadena de conexión principal para una clave de acceso.

Configuración del código de ejemplo para desencadenadores de Redis

  1. En VS Code, agregue un archivo denominado Common.cs al proyecto. Esta clase se usa para ayudar a analizar la respuesta serializada JSON para el PubSubTrigger.

  2. Copie y pegue el siguiente código en el archivo Common.cs:

    public class Common
    {
        public const string connectionString = "redisConnectionString";
    
        public class ChannelMessage
        {
            public string SubscriptionChannel { get; set; }
            public string Channel { get; set; }
            public string Message { get; set; }
        }
    }
    
  3. Agregue un archivo denominado RedisTriggers.cs al proyecto.

  4. Copie y pegue el ejemplo de código siguiente en el nuevo archivo:

    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Extensions.Redis;
    
    public class RedisTriggers
    {
        private readonly ILogger<RedisTriggers> logger;
    
        public RedisTriggers(ILogger<RedisTriggers> logger)
        {
            this.logger = logger;
        }
    
        // PubSubTrigger function listens to messages from the 'pubsubTest' channel.
        [Function("PubSubTrigger")]
        public void PubSub(
        [RedisPubSubTrigger(Common.connectionString, "pubsubTest")] Common.ChannelMessage channelMessage)
        {
        logger.LogInformation($"Function triggered on pub/sub message '{channelMessage.Message}' from channel '{channelMessage.Channel}'.");
        }
    
        // KeyeventTrigger function listens to key events from the 'del' operation.
        [Function("KeyeventTrigger")]
        public void Keyevent(
            [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:del")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' deleted.");
        }
    
        // KeyspaceTrigger function listens to key events on the 'keyspaceTest' key.
        [Function("KeyspaceTrigger")]
        public void Keyspace(
            [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:keyspaceTest")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key 'keyspaceTest' was updated with operation '{channelMessage.Message}'");
        }
    
        // ListTrigger function listens to changes to the 'listTest' list.
        [Function("ListTrigger")]
        public void List(
            [RedisListTrigger(Common.connectionString, "listTest")] string response)
        {
            logger.LogInformation(response);
        }
    
        // StreamTrigger function listens to changes to the 'streamTest' stream.
        [Function("StreamTrigger")]
        public void Stream(
            [RedisStreamTrigger(Common.connectionString, "streamTest")] string response)
        {
            logger.LogInformation(response);
        }
    }
    
  5. En este tutorial se muestran varias maneras de desencadenar en la actividad de Redis:

    • PubSubTrigger, que se desencadena cuando se publica una actividad en el canal Pub/Sub denominado pubsubTest.
    • KeyspaceTrigger, que se basa en el desencadenador Pub/Sub. Úselo para buscar cambios en la clave keyspaceTest.
    • KeyeventTrigger, que también se basa en el desencadenador Pub/Sub. Úselo para buscar cualquier uso del comando DEL.
    • ListTrigger, que busca cambios en la lista listTest.
    • StreamTrigger, que busca cambios en la secuencia streamTest.

Conéctese a la caché

  1. Para desencadenar en la actividad de Redis, deberá pasar la cadena de conexión de la instancia de caché. Esta información se almacena en el archivo local.settings.json que se ha creado automáticamente en la carpeta. Se recomienda usar el archivo de configuración local como procedimiento recomendado de seguridad.

  2. Para conectarse a la memoria caché, agregue una sección ConnectionStrings en el archivo local.settings.json y añada la cadena de conexión mediante el parámetro redisConnectionString. Esta sección debería parecerse a la de este ejemplo:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "redisConnectionString": "<your-connection-string>"
      }
    }
    

    El código de Common.cs busca este valor cuando se ejecuta localmente:

    public const string connectionString = "redisConnectionString";
    

Importante

Este ejemplo se ha simplificado para el tutorial. Para su uso en producción, se recomienda usar Azure Key Vault para almacenar información de cadena de conexión o autenticarse en la instancia de Redis mediante EntraID.

Compilación y ejecución del código localmente

  1. Cambie a la pestaña Ejecutar y depurar en VS Code y seleccione la flecha verde para depurar el código localmente. Si no tuviera instaladas las herramientas principales de Azure Functions, se le pedirá que las instale. En ese caso, deberá reiniciar VS Code después de la instalación.

  2. El código debería crearse correctamente. Es posible realizar un seguimiento del progreso en la salida del terminal.

  3. Para probar la funcionalidad del desencadenador, pruebe a crear y eliminar la clave keyspaceTest.

    Puede usar cualquier forma que prefiera para conectarse a la caché. Una manera sencilla es usar la herramienta de la consola integrada en el portal de Azure Cache for Redis. Vaya a la instancia de caché en Azure Portal y, a continuación, seleccione Consola para abrirla.

    Captura de pantalla de código C# y una cadena de conexión.

    Una vez que la consola esté abierta, pruebe los siguientes comandos:

    • SET keyspaceTest 1
    • SET keyspaceTest 2
    • DEL keyspaceTest
    • PUBLISH pubsubTest testMessage
    • LPUSH listTest test
    • XADD streamTest * name Clippy

    Captura de pantalla de una consola y algunos comandos y resultados de Redis.

  4. Confirme que los desencadenadores se estén activando en el terminal.

    Captura de pantalla del editor de VS Code ejecutando código.

Adición de enlaces de Redis

Los enlaces agregan una manera simplificada de leer o escribir datos almacenados en la instancia de Redis. Para demostrar la ventaja de los enlaces, agregamos otras dos funciones. Una se llama SetGetter, que se desencadena cada vez que se establece una clave y devuelve el nuevo valor de la clave mediante un enlace de entrada. La otra se denomina StreamSetter, que se desencadena cuando se agrega un nuevo elemento a la secuencia myStream y usa un enlace de salida para escribir el valor true en la clave newStreamEntry.

  1. Agregue un archivo denominado RedisBindings.cs al proyecto.

  2. Copie y pegue el ejemplo de código siguiente en el nuevo archivo:

    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Extensions.Redis;
    
    public class RedisBindings
    {
        private readonly ILogger<RedisBindings> logger;
    
        public RedisBindings(ILogger<RedisBindings> logger)
        {
            this.logger = logger;
        }
    
        //This example uses the PubSub trigger to listen to key events on the 'set' operation. A Redis Input binding is used to get the value of the key being set.
        [Function("SetGetter")]
        public void SetGetter(
            [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:set")] Common.ChannelMessage channelMessage,
            [RedisInput(Common.connectionString, "GET {Message}")] string value)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' was set to value '{value}'");
        }
    
        //This example uses the PubSub trigger to listen to key events to the key 'key1'. When key1 is modified, a Redis Output binding is used to set the value of the 'key1modified' key to 'true'.
        [Function("SetSetter")]
        [RedisOutput(Common.connectionString, "SET")]
        public string SetSetter(
            [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:key1")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' was updated. Setting the value of 'key1modified' to 'true'");
            return $"key1modified true";
        }
    }
    
  3. Cambie a la pestaña Ejecutar y depurar en VS Code y seleccione la flecha verde para depurar el código localmente. El código debería crearse correctamente. Es posible realizar un seguimiento del progreso en la salida del terminal.

  4. Para probar la funcionalidad de enlace de entrada, pruebe a establecer un nuevo valor para cualquier clave, por ejemplo, mediante el comando SET hello world Debería ver que la función SetGetter se desencadena y devuelve el valor actualizado.

  5. Para probar la funcionalidad de enlace de salida, intente agregar un nuevo elemento a la secuencia myStream mediante el comando XADD myStream * item Order1. Observe que la función StreamSetter se desencadenó en la nueva entrada de flujo y establezca el valor true en otra clave denominada newStreamEntry. El comando set también desencadena la función SetGetter.

Implementación de código en una función de Azure

  1. Cree una nueva función de Azure:

    1. Vuelva a la pestaña Azure y expanda la suscripción.

    2. Haga clic con el botón derecho en Aplicación de funciones y, a continuación, seleccione Crear aplicación de funciones en Azure (avanzado).

    Captura de pantalla de selecciones para crear una aplicación de funciones en VS Code.

  2. Recibirá varias solicitudes de información para configurar la nueva aplicación de funciones:

    • Escriba un nombre único.
    • Seleccione .NET 8 aislado como pila de runtime.
    • Seleccione Linux o Windows (ambos funcionan).
    • Seleccione un grupo de recursos nuevo o existente para contener la aplicación de funciones.
    • Seleccione la misma región que la instancia de caché.
    • Seleccione Premium como plan de hospedaje.
    • Cree un plan de Azure App Service nuevo.
    • Seleccione el plan de tarifa EP1.
    • Seleccione una cuenta de almacenamiento existente o cree una.
    • Cree un recurso de Application Insights. Use el recurso para confirmar que el desencadenador funcione.

    Importante

    Actualmente no se admiten desencadenadores de Redis en las funciones de consumo.

  3. Espere unos minutos hasta que se cree la nueva aplicación de funciones. Aparece en Aplicación de funciones en la suscripción. Haga clic con el botón derecho en la nueva aplicación de funciones y, a continuación, seleccione Implementar en la aplicación de funciones.

    Captura de pantalla de selecciones para implementar en una aplicación de funciones en VS Code.

  4. La aplicación se compila e inicia la implementación. Puede realizar un seguimiento del progreso en la ventana de salida.

Añadir información de cadena de conexión

  1. En Azure Portal, vaya a la nueva aplicación de funciones y seleccione Variables de entorno en el menú de recursos.

  2. En el panel de trabajo, vaya a Configuración de la aplicación.

  3. En Nombre, escriba redisConnectionString.

  4. En Valor, escriba la cadena de conexión.

  5. Seleccione Aplicar en la página para confirmar.

  6. Vaya al panel Información general y seleccione Reiniciar para reiniciar la aplicación de funciones con la información de la cadena de conexión.

Prueba de los desencadenadores y enlaces

  1. Una vez que se complete la implementación y se agregue la información de la cadena de conexión, abra la aplicación de funciones en Azure Portal. A continuación, seleccione Secuencia de registro en el menú de recursos.

  2. Espere a que Log Analytics se conecte y, a continuación, use la consola de Redis para activar cualquiera de los desencadenadores. Confirme que los desencadenadores se registren aquí.

    Captura de pantalla de un flujo de datos de registro para un recurso de la aplicación de funciones en el menú de recursos.

Limpieza de recursos

Si desea seguir usando los recursos que creó en este artículo, mantenga el grupo de recursos.

De lo contrario, si ya ha terminado con los recursos, puede eliminar el grupo de recursos de Azure que ha creado para evitar cargos.

Importante

La eliminación de un grupo de recursos es irreversible. Cuando elimine un grupo de recursos, todos los recursos contenidos en él se eliminan permanentemente. Asegúrese de no eliminar por accidente el grupo de recursos o los recursos equivocados. Si ha creado los recursos en un grupo de recursos existente que contiene recursos que desea conservar, puede eliminar cada recurso individualmente en lugar de eliminar el grupo de recursos.

Para eliminar un grupo de recursos

  1. Inicie sesión en Azure Portal y después seleccione Grupos de recursos.

  2. Seleccione el grupo de recursos que desea eliminar.

    Si hay muchos grupos de recursos, use el cuadro Filtro para cualquier campo... y escriba el nombre del grupo de recursos que creó para este artículo. Seleccione el grupo de recursos en la lista de resultados.

    Captura de pantalla que muestra una lista de grupos de recursos para eliminar en el panel de trabajo.

  3. Seleccione Eliminar grupo de recursos.

  4. Se le pedirá que confirme la eliminación del grupo de recursos. Escriba el nombre del grupo de recursos para confirmar y, después, seleccione Eliminar.

    Captura de pantalla que muestra un formulario que requiera el nombre del recurso para confirmar la eliminación.

Transcurridos unos instantes, el grupo de recursos y todos sus recursos se eliminan.