Desencadenador de Event Grid para Azure FunctionsEvent Grid trigger for Azure Functions

En este artículo se explica cómo controlar eventos de Event Grid en Azure Functions.This article explains how to handle Event Grid events in Azure Functions.

Event Grid es un servicio de Azure que envía solicitudes HTTP para notificarle acerca de eventos que ocurre en los publicadores.Event Grid is an Azure service that sends HTTP requests to notify you about events that happen in publishers. Un publicador es el servicio o recurso que origina el evento.A publisher is the service or resource that originates the event. Por ejemplo, una cuenta de Azure Blob Storage es un publicador y una carga o eliminación de blobs es un evento.For example, an Azure blob storage account is a publisher, and a blob upload or deletion is an event. Algunos servicios de Azure tienen compatibilidad integrada para publicar eventos en Event Grid.Some Azure services have built-in support for publishing events to Event Grid.

Los controladores de eventos reciben y procesan eventos.Event handlers receive and process events. Azure Functions es uno de los servicios de Azure con compatibilidad integrada para controlar eventos de Event Grid.Azure Functions is one of several Azure services that have built-in support for handling Event Grid events. En este artículo, aprenderá a usar un desencadenador de Event Grid para invocar una función cuando se recibe un evento de Event Grid.In this article, you learn how to use an Event Grid trigger to invoke a function when an event is received from Event Grid.

Si lo prefiere, puede usar un desencadenador HTTP para controlar los eventos de Event Grid; consulte Uso de un desencadenador HTTP como un desencadenador de Event Grid más adelante en este artículo.If you prefer, you can use an HTTP trigger to handle Event Grid Events; see Use an HTTP trigger as an Event Grid trigger later in this article. Actualmente, no puede usar un desencadenador de Event Grid para una aplicación de Azure Functions cuando el evento se entrega en el esquema de CloudEvents.Currently, you can't use an Event Grid trigger for an Azure Functions app when the event is delivered in the CloudEvents schema. En cambio, debe usar un desencadenador HTTP.Instead, use an HTTP trigger.

Esta es la información de referencia para desarrolladores de Azure Functions.This is reference information for Azure Functions developers. Si está familiarizado con Azure Functions, comience con los siguientes recursos:If you're new to Azure Functions, start with the following resources:

Paquetes: Functions 2.xPackages - Functions 2.x

El desencadenador de Event Grid se proporciona en el paquete NuGet Microsoft.Azure.WebJobs.Extensions.EventGrid, versión 2.x.The Event Grid trigger is provided in the Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet package, version 2.x. El código fuente para el paquete está en el repositorio de GitHub azure-functions-eventgrid-extension.Source code for the package is in the azure-functions-eventgrid-extension GitHub repository.

En la siguiente tabla se explica cómo agregar compatibilidad para este enlace en cada entorno de desarrollo.The following table tells how to add support for this binding in each development environment.

Entorno de desarrolloDevelopment environment Para agregar compatibilidad enTo add support in
Functions 2.xFunctions 2.x
Desarrollo local: biblioteca de clases C#Local development - C# class library Instalación del paqueteInstall the package
Desarrollo local: script de C#, JavaScript, F#, Java y PythonLocal development - C# script, JavaScript, F#, Java and Python Registro de la extensiónRegister the extension
Desarrollo con PortalPortal development Instalación al agregar el enlace de salidaInstall when adding output binding

Para saber cómo actualizar las extensiones de enlace existentes en el portal sin tener que volver a publicar su proyecto de aplicación de función, consulte Actualización de las extensiones.To learn how to update existing binding extensions in the portal without having to republish your function app project, see Update your extensions.

Paquetes: Functions 1.xPackages - Functions 1.x

El desencadenador de Event Grid se proporciona en el paquete NuGet Microsoft.Azure.WebJobs.Extensions.EventGrid, versión 1.x.The Event Grid trigger is provided in the Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet package, version 1.x. El código fuente para el paquete está en el repositorio de GitHub azure-functions-eventgrid-extension.Source code for the package is in the azure-functions-eventgrid-extension GitHub repository.

En la siguiente tabla se explica cómo agregar compatibilidad para este enlace en cada entorno de desarrollo.The following table tells how to add support for this binding in each development environment.

Entorno de desarrolloDevelopment environment Para agregar compatibilidad enTo add support in
Functions 1.xFunctions 1.x
Desarrollo local: biblioteca de clases C#Local development - C# class library Instalación del paqueteInstall the package
Desarrollo local: script de C#, JavaScript, F#Local development - C# script, JavaScript, F# AutomáticoAutomatic
Desarrollo con PortalPortal development AutomáticoAutomatic

EjemploExample

Vea el ejemplo específico del lenguaje de un desencadenador de Event Grid:See the language-specific example for an Event Grid trigger:

Para ver un ejemplo de un desencadenador HTTP, consulte Cómo utilizar un desencadenador HTTP más adelante en este artículo.For an HTTP trigger example, see How to use HTTP trigger later in this article.

C# (2.x)C# (2.x)

En el ejemplo siguiente se muestra una función de C# de Functions 2.x que enlaza a EventGridEvent.The following example shows a Functions 2.x C# function that binds to EventGridEvent:

using Microsoft.Azure.EventGrid.Models;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public static class EventGridTriggerCSharp
    {
        [FunctionName("EventGridTest")]
        public static void EventGridTest([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
        {
            log.LogInformation(eventGridEvent.Data.ToString());
        }
    }
}

Para más información, consulte Paquetes, Atributos, Configuración y Uso.For more information, see Packages, Attributes, Configuration, and Usage.

C# (Versión 1.x)C# (Version 1.x)

En el ejemplo siguiente se muestra una función de C# de Functions 1.x que enlaza a JObject:The following example shows a Functions 1.x C# function that binds to JObject:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public static class EventGridTriggerCSharp
    {
        [FunctionName("EventGridTriggerCSharp")]
        public static void Run([EventGridTrigger]JObject eventGridEvent, ILogger log)
        {
            log.LogInformation(eventGridEvent.ToString(Formatting.Indented));
        }
    }
}

Ejemplo de script de C#C# script example

En el ejemplo siguiente se muestra un enlace de desencadenador en un archivo function.json y una función de script de C# que usa el enlace.The following example shows a trigger binding in a function.json file and a C# script function that uses the binding.

Estos son los datos de enlace del archivo function.json:Here's the binding data in the function.json file:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    }
  ],
  "disabled": false
}

Script de C# (versión 2.x)C# script (Version 2.x)

Este es el código de script de C# de Functions 2.x que enlaza a EventGridEvent:Here's Functions 2.x C# script code that binds to EventGridEvent:

#r "Microsoft.Azure.EventGrid"
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(EventGridEvent eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.Data.ToString());
}

Para más información, consulte Paquetes, Atributos, Configuración y Uso.For more information, see Packages, Attributes, Configuration, and Usage.

Script de C# (versión 1.x)C# script (Version 1.x)

Este es el código de script de C# de Functions 1.x que enlaza a JObject:Here's Functions 1.x C# script code that binds to JObject:

#r "Newtonsoft.Json"

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static void Run(JObject eventGridEvent, TraceWriter log)
{
    log.Info(eventGridEvent.ToString(Formatting.Indented));
}

Ejemplo de JavaScriptJavaScript example

En el ejemplo siguiente se muestra un enlace de desencadenador en un archivo function.json y una función de JavaScript que usa el enlace.The following example shows a trigger binding in a function.json file and a JavaScript function that uses the binding.

Estos son los datos de enlace del archivo function.json:Here's the binding data in the function.json file:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    }
  ],
  "disabled": false
}

Este es el código de JavaScript:Here's the JavaScript code:

module.exports = function (context, eventGridEvent) {
    context.log("JavaScript Event Grid function processed a request.");
    context.log("Subject: " + eventGridEvent.subject);
    context.log("Time: " + eventGridEvent.eventTime);
    context.log("Data: " + JSON.stringify(eventGridEvent.data));
    context.done();
};

Ejemplo de PythonPython example

En el ejemplo siguiente se muestra un enlace de desencadenador en un archivo function.json y una función de Python que usa el enlace.The following example shows a trigger binding in a function.json file and a Python function that uses the binding.

Estos son los datos de enlace del archivo function.json:Here's the binding data in the function.json file:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "event",
      "direction": "in"
    }
  ],
  "disabled": false,
  "scriptFile": "__init__.py"
}

Este es el código de Python:Here's the Python code:

import logging
import azure.functions as func


def main(event: func.EventGridEvent):
    logging.info("Python Event Grid function processed a request.")
    logging.info("  Subject: %s", event.subject)
    logging.info("  Time: %s", event.event_time)
    logging.info("  Data: %s", event.get_json())

Desencadenador: ejemplos de JavaTrigger - Java examples

En esta sección se incluyen los ejemplos siguientes:This section contains the following examples:

En los siguientes ejemplos se muestra el enlace de activación en un archivo function.json y las funciones de Java que usan el enlace e imprimen un evento, recibiendo primero el evento como String y un segundo evento como POJO.The following examples show trigger binding in a function.json file and Java functions that use the binding and print out an event, first receiving the event as String and second as a POJO.

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    }
  ]
}

Desencadenador de Event Grid, parámetro de cadena (Java)Event Grid trigger, String parameter (Java)

  @FunctionName("eventGridMonitorString")
  public void logEvent(
    @EventGridTrigger(
      name = "event"
    ) 
    String content, 
    final ExecutionContext context) {
      // log 
      context.getLogger().info("Event content: " + content);      
  }

Desencadenador de Event Grid, parámetro POJO (Java)Event Grid trigger, POJO parameter (Java)

En este ejemplo se usa el siguiente objeto POJO, que representa las propiedades de nivel superior de un evento de Event Grid:This example uses the following POJO, representing the top-level properties of an Event Grid event:

import java.util.Date;
import java.util.Map;

public class EventSchema {

  public String topic;
  public String subject;
  public String eventType;
  public Date eventTime;
  public String id;
  public String dataVersion;
  public String metadataVersion;
  public Map<String, Object> data;

}

Al llegar, la carga útil JSON del evento se deserializa en el POJO EventSchema para que la función pueda usarla.Upon arrival, the event's JSON payload is de-serialized into the EventSchema POJO for use by the function. Esto permite que la función obtenga acceso a las propiedades del evento de manera que esté orientada a los objetos.This allows the function to access the event's properties in an object-oriented way.

  @FunctionName("eventGridMonitor")
  public void logEvent(
    @EventGridTrigger(
      name = "event"
    ) 
    EventSchema event, 
    final ExecutionContext context) {
      // log 
      context.getLogger().info("Event content: ");
      context.getLogger().info("Subject: " + event.subject);
      context.getLogger().info("Time: " + event.eventTime); // automatically converted to Date by the runtime
      context.getLogger().info("Id: " + event.id);
      context.getLogger().info("Data: " + event.data);
  }

En la biblioteca en tiempo de ejecución de funciones de Java, utilice la anotación EventGridTrigger en los parámetros cuyo valor provendría de EventGrid.In the Java functions runtime library, use the EventGridTrigger annotation on parameters whose value would come from EventGrid. Los parámetros con estas anotaciones hacen que la función se ejecuta cuando llega un evento.Parameters with these annotations cause the function to run when an event arrives. Esta anotación se puede usar con tipos nativos de Java, POJO o valores que aceptan valores NULL mediante Optional<T>.This annotation can be used with native Java types, POJOs, or nullable values using Optional<T>.

AtributosAttributes

En las bibliotecas de clases de C#, use el atributo EventGridTrigger.In C# class libraries, use the EventGridTrigger attribute.

A continuación, se muestra un atributo EventGridTrigger en una signatura de método:Here's an EventGridTrigger attribute in a method signature:

[FunctionName("EventGridTest")]
public static void EventGridTest([EventGridTrigger] JObject eventGridEvent, ILogger log)
{
    ...
}

Para un ejemplo completo, consulte el ejemplo de C#.For a complete example, see C# example.

ConfiguraciónConfiguration

En la siguiente tabla se explican las propiedades de configuración de enlace que se establecen en el archivo function.json.The following table explains the binding configuration properties that you set in the function.json file. No hay parámetros de constructor ni propiedades que establecer en el atributo EventGridTrigger.There are no constructor parameters or properties to set in the EventGridTrigger attribute.

Propiedad de function.jsonfunction.json property DESCRIPCIÓNDescription
typetype Requerida: se debe establecer en eventGridTrigger.Required - must be set to eventGridTrigger.
directiondirection Requerida: se debe establecer en in.Required - must be set to in.
namename Requerido: el nombre de la variable que se utiliza en el código de función para el parámetro que recibe los datos del evento.Required - the variable name used in function code for the parameter that receives the event data.

UsoUsage

Para las funciones de C# y F# de Azure Functions 1.x, puede usar los tipos de parámetros siguientes para el desencadenador de Event Grid:For C# and F# functions in Azure Functions 1.x, you can use the following parameter types for the Event Grid trigger:

  • JObject
  • string

Para las funciones de C# y F# de Azure Functions 2.x, también tiene la opción de usar el tipo de parámetro siguiente para el desencadenador de Event Grid:For C# and F# functions in Azure Functions 2.x, you also have the option to use the following parameter type for the Event Grid trigger:

  • Microsoft.Azure.EventGrid.Models.EventGridEvent: define las propiedades de los campos comunes en todos los tipos de evento.Microsoft.Azure.EventGrid.Models.EventGridEvent- Defines properties for the fields common to all event types.

Nota

En Functions v1, si intenta enlazar a Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent, el compilador mostrará un mensaje "en desuso" y le avisará de que use en su lugar Microsoft.Azure.EventGrid.Models.EventGridEvent.In Functions v1 if you try to bind to Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent, the compiler will display a "deprecated" message and advise you to use Microsoft.Azure.EventGrid.Models.EventGridEvent instead. Para usar el tipo más nuevo, haga referencia al paquete NuGet Microsoft.Azure.EventGrid y califique completamente el nombre del tipo EventGridEvent usando el prefijo Microsoft.Azure.EventGrid.Models.To use the newer type, reference the Microsoft.Azure.EventGrid NuGet package and fully qualify the EventGridEvent type name by prefixing it with Microsoft.Azure.EventGrid.Models. Para información sobre cómo hacer referencia a paquetes NuGet en una función de script de C#, consulte Uso de paquetes NuGet.For information about how to reference NuGet packages in a C# script function, see Using NuGet packages

Para las funciones de JavaScript, el parámetro denominado por la propiedad name de function.json tiene una referencia al objeto de evento.For JavaScript functions, the parameter named by the function.json name property has a reference to the event object.

Esquema del eventoEvent schema

Los datos para un evento de Event Grid se reciben como un objeto JSON en el cuerpo de una solicitud HTTP.Data for an Event Grid event is received as a JSON object in the body of an HTTP request. El código JSON es similar al del siguiente ejemplo:The JSON looks similar to the following example:

[{
  "topic": "/subscriptions/{subscriptionid}/resourceGroups/eg0122/providers/Microsoft.Storage/storageAccounts/egblobstore",
  "subject": "/blobServices/default/containers/{containername}/blobs/blobname.jpg",
  "eventType": "Microsoft.Storage.BlobCreated",
  "eventTime": "2018-01-23T17:02:19.6069787Z",
  "id": "{guid}",
  "data": {
    "api": "PutBlockList",
    "clientRequestId": "{guid}",
    "requestId": "{guid}",
    "eTag": "0x8D562831044DDD0",
    "contentType": "application/octet-stream",
    "contentLength": 2248,
    "blobType": "BlockBlob",
    "url": "https://egblobstore.blob.core.windows.net/{containername}/blobname.jpg",
    "sequencer": "000000000000272D000000000003D60F",
    "storageDiagnostics": {
      "batchId": "{guid}"
    }
  },
  "dataVersion": "",
  "metadataVersion": "1"
}]

El ejemplo que se muestra es una matriz de un elemento.The example shown is an array of one element. Event Grid siempre envía una matriz y puede enviar más de un evento en la matriz.Event Grid always sends an array and may send more than one event in the array. El entorno en tiempo de ejecución invoca la función una vez para cada elemento de matriz.The runtime invokes your function once for each array element.

Las propiedades de nivel superior en los datos JSON del evento son las mismas entre todos los tipos de eventos, mientras que el contenido de la propiedad data es específico para cada tipo de evento.The top-level properties in the event JSON data are the same among all event types, while the contents of the data property are specific to each event type. El ejemplo mostrado es para un evento de almacenamiento de blobs.The example shown is for a blob storage event.

Para obtener una explicación de las propiedades comunes y específicas de eventos, consulte Propiedades de evento en la documentación de Event Grid.For explanations of the common and event-specific properties, see Event properties in the Event Grid documentation.

El tipo EventGridEvent define solo las propiedades de nivel superior; la propiedad Data es un JObject.The EventGridEvent type defines only the top-level properties; the Data property is a JObject.

una suscripciónCreate a subscription

Para empezar a recibir solicitudes HTTP de Event Grid, cree una suscripción a Event Grid que especifique la dirección URL de punto de conexión que invoca la función.To start receiving Event Grid HTTP requests, create an Event Grid subscription that specifies the endpoint URL that invokes the function.

Portal de AzureAzure portal

Para las funciones que desarrolle en Azure Portal con el desencadenador de Event Grid, seleccione Agregar suscripción a Event Grid.For functions that you develop in the Azure portal with the Event Grid trigger, select Add Event Grid subscription.

Creación de una suscripción en el portal

Al seleccionar este vínculo, el portal abre la página Crear suscripción de eventos con la dirección URL del punto de conexión preinstalada.When you select this link, the portal opens the Create Event Subscription page with the endpoint URL prefilled.

Dirección URL del punto de conexión automáticamente rellenada

Para obtener más información sobre cómo crear suscripciones mediante el Azure Portal, consulte Creación de eventos personalizados: Azure Portal en la documentación de Event Grid.For more information about how to create subscriptions by using the Azure portal, see Create custom event - Azure portal in the Event Grid documentation.

CLI de AzureAzure CLI

Para crear una suscripción mediante el uso de la CLI de Azure, utilice el comando az eventgrid event-subscription create.To create a subscription by using the Azure CLI, use the az eventgrid event-subscription create command.

El comando requiere la dirección URL del punto de conexión que invoca la función.The command requires the endpoint URL that invokes the function. En el siguiente ejemplo se muestra el patrón de la dirección URL específico de la versión:The following example shows the version-specific URL pattern:

Entorno en tiempo de ejecución versión 2.xVersion 2.x runtime

https://{functionappname}.azurewebsites.net/runtime/webhooks/eventgrid?functionName={functionname}&code={systemkey}

Entorno en tiempo de ejecución versión 1.xVersion 1.x runtime

https://{functionappname}.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName={functionname}&code={systemkey}

La clave de sistema es una clave de autorización que debe incluirse en la dirección URL del punto de conexión para desencadenador de Event Grid.The system key is an authorization key that has to be included in the endpoint URL for an Event Grid trigger. En la siguiente sección se explica cómo obtener la clave del sistema.The following section explains how to get the system key.

En este ejemplo se suscribe a una cuenta de almacenamiento de blobs (con un marcador de posición para la clave del sistema):Here's an example that subscribes to a blob storage account (with a placeholder for the system key):

Entorno en tiempo de ejecución versión 2.xVersion 2.x runtime

az eventgrid resource event-subscription create -g myResourceGroup \
--provider-namespace Microsoft.Storage --resource-type storageAccounts \
--resource-name myblobstorage12345 --name myFuncSub  \
--included-event-types Microsoft.Storage.BlobCreated \
--subject-begins-with /blobServices/default/containers/images/blobs/ \
--endpoint https://mystoragetriggeredfunction.azurewebsites.net/runtime/webhooks/eventgrid?functionName=imageresizefunc&code=<key>

Entorno en tiempo de ejecución versión 1.xVersion 1.x runtime

az eventgrid resource event-subscription create -g myResourceGroup \
--provider-namespace Microsoft.Storage --resource-type storageAccounts \
--resource-name myblobstorage12345 --name myFuncSub  \
--included-event-types Microsoft.Storage.BlobCreated \
--subject-begins-with /blobServices/default/containers/images/blobs/ \
--endpoint https://mystoragetriggeredfunction.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName=imageresizefunc&code=<key>

Para más información sobre cómo crear una suscripción, consulte la guía de inicio rápido sobre el almacenamiento de blobs o cualquiera de las demás guías de inicio rápido de Event Grid.For more information about how to create a subscription, see the blob storage quickstart or the other Event Grid quickstarts.

Obtención de la clave del sistemaGet the system key

Puede obtener la clave del sistema mediante la siguiente API (HTTP GET):You can get the system key by using the following API (HTTP GET):

Entorno en tiempo de ejecución versión 2.xVersion 2.x runtime

http://{functionappname}.azurewebsites.net/admin/host/systemkeys/eventgrid_extension?code={masterkey}

Entorno en tiempo de ejecución versión 1.xVersion 1.x runtime

http://{functionappname}.azurewebsites.net/admin/host/systemkeys/eventgridextensionconfig_extension?code={masterkey}

Es una API de administración, por lo que requiere la clave maestra de la aplicación de función.This is an admin API, so it requires your function app master key. No confunda la clave del sistema (para invocar una función de desencadenador de Event Grid) con la clave maestra (para realizar tareas administrativas en la aplicación de función).Don't confuse the system key (for invoking an Event Grid trigger function) with the master key (for performing administrative tasks on the function app). Cuando se suscriba a un tema de Event Grid, asegúrese de usar la clave del sistema.When you subscribe to an Event Grid topic, be sure to use the system key.

Este es un ejemplo de la respuesta que proporciona la clave del sistema:Here's an example of the response that provides the system key:

{
  "name": "eventgridextensionconfig_extension",
  "value": "{the system key for the function}",
  "links": [
    {
      "rel": "self",
      "href": "{the URL for the function, without the system key}"
    }
  ]
}

Puede obtener la clave maestra de la aplicación de función en la pestaña Configuración de Function App del portal.You can get the master key for your function app from the Function app settings tab in the portal.

Importante

La clave maestra proporciona acceso de administrador a la aplicación de función.The master key provides administrator access to your function app. Esta clave no debe compartirse con terceros ni distribuirse en aplicaciones cliente nativas.Don't share this key with third parties or distribute it in native client applications.

Para más información, consulte Claves de autorización en el artículo de referencia del desencadenador HTTP.For more information, see Authorization keys in the HTTP trigger reference article.

También puede enviar un HTTP PUT para especificar el mismo valor de la clave.Alternatively, you can send an HTTP PUT to specify the key value yourself.

Pruebas locales con la aplicación web de visorLocal testing with viewer web app

Para probar localmente un desencadenador de Event Grid, debe enviar las solicitudes HTTP de Event Grid desde su origen en la nube a la máquina local.To test an Event Grid trigger locally, you have to get Event Grid HTTP requests delivered from their origin in the cloud to your local machine. Una manera de hacerlo es mediante la captura de solicitudes en línea y de reenviarlas manualmente a la máquina local:One way to do that is by capturing requests online and manually resending them on your local machine:

  1. Cree una aplicación web de visor que capture los mensajes de eventos.Create a viewer web app that captures event messages.
  2. Cree una suscripción a Event Grid que envíe eventos a la aplicación de visor.Create an Event Grid subscription that sends events to the viewer app.
  3. Genere una solicitud y copie el cuerpo de la solicitud desde la aplicación de visor.Generate a request and copy the request body from the viewer app.
  4. Envíe manualmente la solicitud a la dirección URL de localhost de la función del desencadenador de Event Grid.Manually post the request to the localhost URL of your Event Grid trigger function.

Cuando haya finalizado las pruebas, puede utilizar la misma suscripción para producción actualizando el punto de conexión.When you're done testing, you can use the same subscription for production by updating the endpoint. Utilice el comando az eventgrid event-subscription update de la CLI de Azure.Use the az eventgrid event-subscription update Azure CLI command.

Creación de una aplicación web de visorCreate a viewer web app

Para simplificar la captura de mensajes de evento, puede implementar una aplicación web de ejemplo que muestre los mensajes de los eventos.To simplify capturing event messages, you can deploy a pre-built web app that displays the event messages. La solución implementada incluye un plan de App Service, una aplicación web de App Service y el código fuente desde GitHub.The deployed solution includes an App Service plan, an App Service web app, and source code from GitHub.

Seleccione Deploy to Azure (Implementar en Azure) para implementar la solución en su suscripción.Select Deploy to Azure to deploy the solution to your subscription. En Azure Portal, proporcione valores para los parámetros.In the Azure portal, provide values for the parameters.

La implementación puede tardar unos minutos en completarse.The deployment may take a few minutes to complete. Después de que la implementación se haya realizado correctamente, puede ver la aplicación web para asegurarse de que se está ejecutando.After the deployment has succeeded, view your web app to make sure it's running. En un explorador web, vaya a: https://<your-site-name>.azurewebsites.netIn a web browser, navigate to: https://<your-site-name>.azurewebsites.net

Verá el sitio, pero aún no se ha publicado en él ningún evento.You see the site but no events have been posted to it yet.

Visualización del nuevo sitio

Creación de una suscripción de Event GridCreate an Event Grid subscription

Cree una suscripción de Event Grid del tipo que desee probar y asígnele la dirección URL de su aplicación web como punto de conexión para la notificación de eventos.Create an Event Grid subscription of the type you want to test, and give it the URL from your web app as the endpoint for event notification. El punto de conexión de la aplicación web debe incluir el sufijo /api/updates/.The endpoint for your web app must include the suffix /api/updates/. Por lo tanto, dirección URL completa es https://<your-site-name>.azurewebsites.net/api/updatesSo, the full URL is https://<your-site-name>.azurewebsites.net/api/updates

Para obtener información sobre cómo crear suscripciones mediante Azure Portal, consulte Creación de eventos personalizados: Azure Portal en la documentación de Event Grid.For information about how to create subscriptions by using the Azure portal, see Create custom event - Azure portal in the Event Grid documentation.

Generación de una solicitudGenerate a request

Desencadene un evento que generará tráfico HTTP a su punto de conexión de aplicación web.Trigger an event that will generate HTTP traffic to your web app endpoint. Por ejemplo, si crea una suscripción de almacenamiento de blobs, cargue o elimine un blob.For example, if you created a blob storage subscription, upload or delete a blob. Cuando aparezca una solicitud en la aplicación web, copie el cuerpo de la solicitud.When a request shows up in your web app, copy the request body.

La solicitud de validación de la suscripción se recibirá primero; ignore cualquier solicitud de validación y copie la solicitud del evento.The subscription validation request will be received first; ignore any validation requests, and copy the event request.

Copia del cuerpo de la solicitud de la aplicación web

Envío manual de la solicitudManually post the request

Ejecute la función de Event Grid localmente.Run your Event Grid function locally.

Use una herramienta como Postman o curl para crear una solicitud HTTP POST:Use a tool such as Postman or curl to create an HTTP POST request:

  • Establezca un encabezado Content-Type: application/json.Set a Content-Type: application/json header.
  • Establezca un encabezado aeg-event-type: Notification.Set an aeg-event-type: Notification header.
  • Pegue los datos de RequestBin en el cuerpo de la solicitud.Paste the RequestBin data into the request body.
  • Envíe la dirección URL de la función del desencadenador de Event Grid.Post to the URL of your Event Grid trigger function.
    • Para 2.x, use el patrón siguiente:For 2.x use the following pattern:

      http://localhost:7071/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}
      
    • Para 1.x, use:For 1.x use:

      http://localhost:7071/admin/extensions/EventGridExtensionConfig?functionName={FUNCTION_NAME}
      

El parámetro functionName debe ser el nombre especificado en el atributo FunctionName.The functionName parameter must be the name specified in the FunctionName attribute.

Las capturas de pantalla siguientes muestran los encabezados y el cuerpo de la solicitud en Postman:The following screenshots show the headers and request body in Postman:

Encabezados en Postman

Cuerpo de la solicitud en Postman

La función de desencadenador de Event Grid ejecuta y muestra registros similares a los del ejemplo siguiente:The Event Grid trigger function executes and shows logs similar to the following example:

Registros de la función de desencadenador de Event Grid de ejemplo

Pruebas locales con ngrokLocal testing with ngrok

Otra forma de probar un desencadenador de Event Grid localmente consiste en automatizar la conexión HTTP entre Internet y su equipo de desarrollo.Another way to test an Event Grid trigger locally is to automate the HTTP connection between the Internet and your development computer. Puede hacerlo con una herramienta como ngrok:You can do that with a tool like ngrok:

  1. Cree un punto de conexión de ngrok.Create an ngrok endpoint.
  2. Ejecute la función de desencadenador de Event Grid.Run the Event Grid trigger function.
  3. Cree una suscripción a Event Grid que envíe eventos al punto de conexión de ngrok.Create an Event Grid subscription that sends events to the ngrok endpoint.
  4. Desencadene un evento.Trigger an event.

Cuando haya finalizado las pruebas, puede utilizar la misma suscripción para producción actualizando el punto de conexión.When you're done testing, you can use the same subscription for production by updating the endpoint. Utilice el comando az eventgrid event-subscription update de la CLI de Azure.Use the az eventgrid event-subscription update Azure CLI command.

Creación de punto de conexión de ngrokCreate an ngrok endpoint

Descargue ngrok.exe en ngrok y ejecútelo con el siguiente comando:Download ngrok.exe from ngrok, and run with the following command:

ngrok http -host-header=localhost 7071

Es necesario el parámetro -host-header porque el entorno en tiempo de ejecución de las funciones espera solicitudes de localhost cuando se ejecuta en localhost.The -host-header parameter is needed because the functions runtime expects requests from localhost when it runs on localhost. 7071 es el número de puerto predeterminado cuando el entorno de tiempo de ejecución se ejecuta localmente.7071 is the default port number when the runtime runs locally.

El comando crea una salida similar a la siguiente:The command creates output like the following:

Session Status                online
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://263db807.ngrok.io -> localhost:7071
Forwarding                    https://263db807.ngrok.io -> localhost:7071

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

Usará la dirección URL https://{subdomain}.ngrok.io para la suscripción de Event Grid.You'll use the https://{subdomain}.ngrok.io URL for your Event Grid subscription.

Ejecución de la función de desencadenador de Event GridRun the Event Grid trigger function

La dirección URL de ngrok no recibe un tratamiento especial por parte de Event Grid, por lo que su función debe ejecutarse localmente cuando se crea la suscripción.The ngrok URL doesn't get special handling by Event Grid, so your function must be running locally when the subscription is created. Si no es así, no se envía la respuesta de validación y se produce un error al crear la suscripción.If it isn't, the validation response doesn't get sent and the subscription creation fails.

una suscripciónCreate a subscription

Cree una suscripción a Event Grid del tipo que quiere probar y asígnele el punto de conexión ngrok.Create an Event Grid subscription of the type you want to test, and give it your ngrok endpoint.

Use este patrón de punto de conexión para las funciones 2.x:Use this endpoint pattern for Functions 2.x:

https://{SUBDOMAIN}.ngrok.io/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}

Use este patrón de punto de conexión para las funciones 1.x:Use this endpoint pattern for Functions 1.x:

https://{SUBDOMAIN}.ngrok.io/admin/extensions/EventGridExtensionConfig?functionName={FUNCTION_NAME}

El parámetro {FUNCTION_NAME} debe ser el nombre especificado en el atributo FunctionName.The {FUNCTION_NAME} parameter must be the name specified in the FunctionName attribute.

A continuación se facilita un ejemplo mediante el uso de la CLI de Azure:Here's an example using the Azure CLI:

az eventgrid event-subscription create --resource-id /subscriptions/aeb4b7cb-b7cb-b7cb-b7cb-b7cbb6607f30/resourceGroups/eg0122/providers/Microsoft.Storage/storageAccounts/egblobstor0122 --name egblobsub0126 --endpoint https://263db807.ngrok.io/runtime/webhooks/eventgrid?functionName=EventGridTrigger

Para más información sobre cómo crear una suscripción, consulte Creación de una suscripción anteriormente en este artículo.For information about how to create a subscription, see Create a subscription earlier in this article.

Desencadenar un eventoTrigger an event

Desencadene un evento que generará tráfico HTTP a su punto de conexión de ngrok.Trigger an event that will generate HTTP traffic to your ngrok endpoint. Por ejemplo, si crea una suscripción de almacenamiento de blobs, cargue o elimine un blob.For example, if you created a blob storage subscription, upload or delete a blob.

La función de desencadenador de Event Grid ejecuta y muestra registros similares a los del ejemplo siguiente:The Event Grid trigger function executes and shows logs similar to the following example:

Registros de la función de desencadenador de Event Grid de ejemplo

Uso de un desencadenador HTTP como un desencadenador de Event GridUse an HTTP trigger as an Event Grid trigger

Los eventos de Event Grid se reciben como solicitudes HTTP, por lo que puede controlar los eventos mediante un desencadenador HTTP en lugar de un desencadenador de Event Grid.Event Grid events are received as HTTP requests, so you can handle events by using an HTTP trigger instead of an Event Grid trigger. Una posible razón para hacerlo es tener más control sobre la dirección URL del punto de conexión que invoca la función.One possible reason for doing that is to get more control over the endpoint URL that invokes the function. Otro motivo es que necesite recibir eventos en el esquema de CloudEvents.Another reason is when you need to receive events in the CloudEvents schema. Actualmente, el desencadenador de Event Grid no es compatible con el esquema de CloudEvents.Currently, the Event Grid trigger doesn't support the CloudEvents schema. Los ejemplos de esta sección muestran soluciones tanto para el esquema de Event Grid como para el de CloudEvents.The examples in this section show solutions for both Event Grid schema and CloudEvents schema.

Si se usa un desencadenador HTTP, tiene que escribir código sobre lo que el desencadenador de Event Grid hace automáticamente:If you use an HTTP trigger, you have to write code for what the Event Grid trigger does automatically:

Para más información acerca de la dirección URL que se debe utilizar para invocar la función localmente o cuando se ejecuta en Azure, consulte la documentación de referencia de enlaces del desencadenador HTTP.For information about the URL to use for invoking the function locally or when it runs in Azure, see the HTTP trigger binding reference documentation

Esquema de Event GridEvent Grid schema

El siguiente ejemplo de código C# para un desencadenador HTTP simula el comportamiento del desencadenador de Event Grid.The following sample C# code for an HTTP trigger simulates Event Grid trigger behavior. Use este ejemplo para los eventos entregados en el esquema de Event Grid.Use this example for events delivered in the Event Grid schema.

[FunctionName("HttpTrigger")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequestMessage req,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    var messages = await req.Content.ReadAsAsync<JArray>();

    // If the request is for subscription validation, send back the validation code.
    if (messages.Count > 0 && string.Equals((string)messages[0]["eventType"],
        "Microsoft.EventGrid.SubscriptionValidationEvent",
        System.StringComparison.OrdinalIgnoreCase))
    {
        log.LogInformation("Validate request received");
        return req.CreateResponse<object>(new
        {
            validationResponse = messages[0]["data"]["validationCode"]
        });
    }

    // The request is not for subscription validation, so it's for one or more events.
    foreach (JObject message in messages)
    {
        // Handle one event.
        EventGridEvent eventGridEvent = message.ToObject<EventGridEvent>();
        log.LogInformation($"Subject: {eventGridEvent.Subject}");
        log.LogInformation($"Time: {eventGridEvent.EventTime}");
        log.LogInformation($"Event data: {eventGridEvent.Data.ToString()}");
    }

    return req.CreateResponse(HttpStatusCode.OK);
}

El siguiente ejemplo de código JavaScript para un desencadenador HTTP simula el comportamiento del desencadenador de Event Grid.The following sample JavaScript code for an HTTP trigger simulates Event Grid trigger behavior. Use este ejemplo para los eventos entregados en el esquema de Event Grid.Use this example for events delivered in the Event Grid schema.

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var messages = req.body;
    // If the request is for subscription validation, send back the validation code.
    if (messages.length > 0 && messages[0].eventType == "Microsoft.EventGrid.SubscriptionValidationEvent") {
        context.log('Validate request received');
        var code = messages[0].data.validationCode;
        context.res = { status: 200, body: { "ValidationResponse": code } };
    }
    else {
        // The request is not for subscription validation, so it's for one or more events.
        // Event Grid schema delivers events in an array.
        for (var i = 0; i < messages.length; i++) {
            // Handle one event.
            var message = messages[i];
            context.log('Subject: ' + message.subject);
            context.log('Time: ' + message.eventTime);
            context.log('Data: ' + JSON.stringify(message.data));
        }
    }
    context.done();
};

El código de control de eventos pasa al bucle a través de la matriz messages.Your event-handling code goes inside the loop through the messages array.

Esquema de CloudEventsCloudEvents schema

El siguiente ejemplo de código C# para un desencadenador HTTP simula el comportamiento del desencadenador de Event Grid.The following sample C# code for an HTTP trigger simulates Event Grid trigger behavior. Utilice este ejemplo para los eventos entregados en el esquema de CloudEvents.Use this example for events delivered in the CloudEvents schema.

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

    var requestmessage = await req.Content.ReadAsStringAsync();
    var message = JToken.Parse(requestmessage);

    if (message.Type == JTokenType.Array)
    {
        // If the request is for subscription validation, send back the validation code.
        if (string.Equals((string)message[0]["eventType"],
        "Microsoft.EventGrid.SubscriptionValidationEvent",
        System.StringComparison.OrdinalIgnoreCase))
        {
            log.LogInformation("Validate request received");
            return req.CreateResponse<object>(new
            {
                validationResponse = message[0]["data"]["validationCode"]
            });
        }
    }
    else
    {
        // The request is not for subscription validation, so it's for an event.
        // CloudEvents schema delivers one event at a time.
        log.LogInformation($"Source: {message["source"]}");
        log.LogInformation($"Time: {message["eventTime"]}");
        log.LogInformation($"Event data: {message["data"].ToString()}");
    }

    return req.CreateResponse(HttpStatusCode.OK);
}

El siguiente ejemplo de código JavaScript para un desencadenador HTTP simula el comportamiento del desencadenador de Event Grid.The following sample JavaScript code for an HTTP trigger simulates Event Grid trigger behavior. Utilice este ejemplo para los eventos entregados en el esquema de CloudEvents.Use this example for events delivered in the CloudEvents schema.

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var message = req.body;
    // If the request is for subscription validation, send back the validation code.
    if (message.length > 0 && message[0].eventType == "Microsoft.EventGrid.SubscriptionValidationEvent") {
        context.log('Validate request received');
        var code = message[0].data.validationCode;
        context.res = { status: 200, body: { "ValidationResponse": code } };
    }
    else {
        // The request is not for subscription validation, so it's for an event.
        // CloudEvents schema delivers one event at a time.
        var event = JSON.parse(message);
        context.log('Source: ' + event.source);
        context.log('Time: ' + event.eventTime);
        context.log('Data: ' + JSON.stringify(event.data));
    }
    context.done();
};

Pasos siguientesNext steps