Déclencheur Event Grid pour Azure FunctionsEvent Grid trigger for Azure Functions

Cet article explique comment gérer les événements Event Grid dans Azure Functions.This article explains how to handle Event Grid events in Azure Functions.

Event Grid est un service Azure qui envoie des requêtes HTTP de notification au sujet des événements qui surviennent dans les éditeurs.Event Grid is an Azure service that sends HTTP requests to notify you about events that happen in publishers. L’éditeur d’un événement est le service ou la ressource qui est à l’origine de l’événement.A publisher is the service or resource that originates the event. Par exemple, un compte de Stockage Blob Azure est un éditeur, et un chargement ou une suppression d’objet blob un événement.For example, an Azure blob storage account is a publisher, and a blob upload or deletion is an event. Certains services Azure intègrent la prise en charge de la publication d’événements sur Event Grid.Some Azure services have built-in support for publishing events to Event Grid.

Les gestionnaires d’événements reçoivent et traitent les événements.Event handlers receive and process events. Azure Functions est l’un des nombreux services Azure qui intègrent la prise en charge de la gestion des événements Event Grid.Azure Functions is one of several Azure services that have built-in support for handling Event Grid events. Cet article explique comment utiliser un déclencheur Event Grid pour appeler une fonction à la réception d’un événement en provenance d’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 vous préférez, vous pouvez utiliser un déclencheur HTTP pour gérer les événements Event Grid ; consultez la section Utiliser un déclencheur HTTP comme déclencheur Event Grid dans la suite de cet article.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. Actuellement, vous ne pouvez pas utiliser un déclencheur Event Grid pour une application Azure Functions quand l’événement est remis dans le schéma CloudEvents.Currently, you can't use an Event Grid trigger for an Azure Functions app when the event is delivered in the CloudEvents schema. Utilisez à la place un déclencheur HTTP.Instead, use an HTTP trigger.

Il s’agit des informations de référence pour les développeurs Azure Functions.This is reference information for Azure Functions developers. Si vous ne connaissez pas bien Azure Functions, commencez par consulter les ressources suivantes :If you're new to Azure Functions, start with the following resources:

Packages - Functions 2.x et ultérieurPackages - Functions 2.x and higher

Le déclencheur Event Grid est fourni dans le package Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet, version 2.x.The Event Grid trigger is provided in the Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet package, version 2.x. Le code source pour le package se trouve dans le référentiel azure-functions-eventgrid-extension GitHub.Source code for the package is in the azure-functions-eventgrid-extension GitHub repository.

Le tableau suivant indique comment ajouter la prise en charge de cette liaison dans chaque environnement de développement.The following table tells how to add support for this binding in each development environment.

Environnement de développementDevelopment environment Pour ajouter la prise en chargeTo add support
Développement local - Bibliothèque de classes C#Local development - C# class library Installer le package.Install the package
Développement local - Script C#, JavaScript, F#, Java et PythonLocal development - C# script, JavaScript, F#, Java and Python Enregistrer l’extensionRegister the extension
Développement sur le portailPortal development Installer lors de l’ajout d’une liaison de sortieInstall when adding output binding

Pour apprendre comment mettre à jour les extensions de liaison existantes dans le portail sans avoir à republier votre projet d'application de fonction, voir Mettre à jour vos extensions.To learn how to update existing binding extensions in the portal without having to republish your function app project, see Update your extensions.

Packages - Functions 1.xPackages - Functions 1.x

Le déclencheur Event Grid est fourni dans le package Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet, version 1.x.The Event Grid trigger is provided in the Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet package, version 1.x. Le code source pour le package se trouve dans le référentiel azure-functions-eventgrid-extension GitHub.Source code for the package is in the azure-functions-eventgrid-extension GitHub repository.

Le tableau suivant indique comment ajouter la prise en charge de cette liaison dans chaque environnement de développement.The following table tells how to add support for this binding in each development environment.

Environnement de développementDevelopment environment Pour ajouter la prise en charge dansTo add support in
Functions 1.xFunctions 1.x
Développement local - Bibliothèque de classes C#Local development - C# class library Installer le package.Install the package
Développement local - Script C#, JavaScript, F#Local development - C# script, JavaScript, F# AutomatiqueAutomatic
Développement sur le portailPortal development AutomatiqueAutomatic

ExemplesExample

Consultez l’exemple de déclencheur Event Grid correspondant au langage souhaité :See the language-specific example for an Event Grid trigger:

Vous trouverez un exemple de déclencheur HTTP dans la section Guide pratique pour utiliser un déclencheur HTTP dans la suite de cet article.For an HTTP trigger example, see How to use HTTP trigger later in this article.

C# (2.x et ultérieur)C# (2.x and higher)

L’exemple suivant montre une fonction C# liée à EventGridEvent :The following example shows a 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());
        }
    }
}

Pour plus d'informations, consultez Packages, Attributs, Configuration et Utilisation.For more information, see Packages, Attributes, Configuration, and Usage.

C# (version 1.x)C# (Version 1.x)

L’exemple suivant montre une fonction C# Functions 1.x liée à 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));
        }
    }
}

Exemple de script C#C# script example

L’exemple suivant montre une liaison de déclencheur dans un fichier function.json et une fonction de script C# qui utilise la liaison.The following example shows a trigger binding in a function.json file and a C# script function that uses the binding.

Voici les données de liaison dans le fichier function.json :Here's the binding data in the function.json file:

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

Script C# (Version 2.x et ultérieure)C# script (Version 2.x and higher)

Voici un exemple qui crée une liaison avec EventGridEvent :Here's an example 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());
}

Pour plus d'informations, consultez Packages, Attributs, Configuration et Utilisation.For more information, see Packages, Attributes, Configuration, and Usage.

Script C# (version 1.x)C# script (Version 1.x)

Voici le code de script C# Functions 1.x qui lie à 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));
}

Exemple JavaScriptJavaScript example

L’exemple suivant montre une liaison de déclencheur dans un fichier function.json et une fonction JavaScript qui utilise la liaison.The following example shows a trigger binding in a function.json file and a JavaScript function that uses the binding.

Voici les données de liaison dans le fichier function.json :Here's the binding data in the function.json file:

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

Voici le code 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();
};

Exemple PythonPython example

L’exemple suivant montre une liaison de déclencheur dans un fichier function.json et une fonction Python qui utilise la liaison.The following example shows a trigger binding in a function.json file and a Python function that uses the binding.

Voici les données de liaison dans le fichier function.json :Here's the binding data in the function.json file:

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

Voici le code 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())

Déclencheur : exemples JavaTrigger - Java examples

Cette section contient les exemples suivants :This section contains the following examples:

Les exemples suivants illustrent la liaison de déclencheur dans un fichier function.json et les fonctions Java qui utilisent la liaison et affichent un événement, en recevant d’abord l’événement comme String et ensuite comme un 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"
    }
  ]
}

Déclencheur Event Grid, paramètre String (Java)Event Grid trigger, String parameter (Java)

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

Déclencheur Event Grid, paramètre POJO (Java)Event Grid trigger, POJO parameter (Java)

Cet exemple utilise le POJO suivant, représentant les propriétés de niveau supérieur d’un événement 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;

}

À l’arrivée, la charge utile JSON de l’événement est désérialisée dans le POJO EventSchema pour une utilisation par la fonction.Upon arrival, the event's JSON payload is de-serialized into the EventSchema POJO for use by the function. Cela permet à la fonction d’accéder aux propriétés de l’événement dans une approche orientée objet.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) {
      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);
  }

Dans la bibliothèque du runtime des fonctions Java, utilisez l’annotation EventGridTrigger sur les paramètres dont la valeur proviendrait d’EventGrid.In the Java functions runtime library, use the EventGridTrigger annotation on parameters whose value would come from EventGrid. Les paramètres ayant ces annotations entraînent l’exécution de la fonction quand un événement se produit.Parameters with these annotations cause the function to run when an event arrives. Vous pouvez utiliser cette annotation avec des types Java natifs, des objets POJO ou des valeurs Null à l’aide de Optional<T>.This annotation can be used with native Java types, POJOs, or nullable values using Optional<T>.

AttributsAttributes

Dans les bibliothèques de classes C#, utilisez l’attribut EventGridTrigger.In C# class libraries, use the EventGridTrigger attribute.

Voici un attribut EventGridTrigger dans une signature de méthode :Here's an EventGridTrigger attribute in a method signature:

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

Vous trouverez un exemple complet sur la page Exemple C#.For a complete example, see C# example.

ConfigurationConfiguration

Le tableau suivant décrit les propriétés de configuration de liaison que vous définissez dans le fichier function.json.The following table explains the binding configuration properties that you set in the function.json file. Il n’y a aucun paramètre de constructeur ni aucune propriété à définir dans l’attribut EventGridTrigger.There are no constructor parameters or properties to set in the EventGridTrigger attribute.

Propriété function.jsonfunction.json property DescriptionDescription
typetype Obligatoire : doit être défini sur eventGridTrigger.Required - must be set to eventGridTrigger.
directiondirection Obligatoire : doit être défini sur in.Required - must be set to in.
namename Obligatoire : nom de variable utilisé dans le code de fonction pour le paramètre qui reçoit les données de l’événement.Required - the variable name used in function code for the parameter that receives the event data.

UsageUsage

Pour les fonctions C# et F# dans Azure Functions 1.x, vous pouvez utiliser les types de paramètres suivants pour le déclencheur 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

Pour les fonctions C# et F# dans Azure Functions 2.x et ultérieur, vous pouvez également utiliser le type de paramètre suivant pour le déclencheur Event Grid :For C# and F# functions in Azure Functions 2.x and higher, you also have the option to use the following parameter type for the Event Grid trigger:

  • Microsoft.Azure.EventGrid.Models.EventGridEvent- Définit les propriétés pour les champs communs à tous les types d’événements.Microsoft.Azure.EventGrid.Models.EventGridEvent- Defines properties for the fields common to all event types.

Notes

Dans Functions v1, si vous essayez de lier à Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent, le compilateur affiche un message « déprécié » et vous conseille d’utiliser Microsoft.Azure.EventGrid.Models.EventGridEvent à la place.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. Pour utiliser le type le plus récent, référencez le package NuGet Microsoft.Azure.EventGrid et qualifiez entièrement le nom de type EventGridEvent en le faisant précéder de 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. Pour plus d’informations sur la façon de référencer des packages NuGet dans une fonction de script C#, consultez Utiliser des packages NuGet.For information about how to reference NuGet packages in a C# script function, see Using NuGet packages

Pour les fonctions JavaScript, le paramètre nommé par la propriété function.json name comporte une référence à l’objet de l’événement.For JavaScript functions, the parameter named by the function.json name property has a reference to the event object.

Schéma d’événementEvent schema

Les données d’un événement Event Grid sont réceptionnées sous la forme d’un objet JSON dans le corps d’une requête HTTP,Data for an Event Grid event is received as a JSON object in the body of an HTTP request. comme dans l’exemple suivant :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"
}]

Cet exemple est un tableau comportant un seul élément.The example shown is an array of one element. Event Grid envoie toujours un tableau et peut y inclure plusieurs événements.Event Grid always sends an array and may send more than one event in the array. Le runtime appelle la fonction une fois par élément du tableau.The runtime invokes your function once for each array element.

Les propriétés de niveau supérieur présentes dans les données JSON de l’événement sont les mêmes quel que soit le type d’événement, tandis que la valeur de la propriété data est propre à chaque type d’événement.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. L’exemple correspond à un événement de Stockage Blob.The example shown is for a blob storage event.

Vous trouverez des explications sur les propriétés communes et propres aux événements dans la section Propriétés des événements de la documentation Event Grid.For explanations of the common and event-specific properties, see Event properties in the Event Grid documentation.

Le type EventGridEvent définit uniquement les propriétés de niveau supérieur ; la propriété Data est un JObject.The EventGridEvent type defines only the top-level properties; the Data property is a JObject.

Création d’un abonnementCreate a subscription

Pour pouvoir recevoir des requêtes HTTP Event Grid, créez un abonnement Event Grid spécifiant l’URL de point de terminaison qui appelle la fonction.To start receiving Event Grid HTTP requests, create an Event Grid subscription that specifies the endpoint URL that invokes the function.

Portail AzureAzure portal

Pour les fonctions développées sur le Portail Azure avec le déclencheur Event Grid, sélectionnez Ajouter un abonnement Event Grid.For functions that you develop in the Azure portal with the Event Grid trigger, select Add Event Grid subscription.

Créer un abonnement sur le Portail

Ce lien ouvre la page Créer un abonnement aux événements sur le Portail, en préremplissant l’URL de point de terminaison.When you select this link, the portal opens the Create Event Subscription page with the endpoint URL prefilled.

URL de point de terminaison préremplie

Pour plus d’informations sur la création d’abonnements à l’aide du Portail Azure, consultez la section Créer un événement personnalisé - Portail Azure dans la documentation 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.

D’Azure CLIAzure CLI

Pour créer un abonnement avec Azure CLI, utilisez la commande az eventgrid event-subscription create.To create a subscription by using the Azure CLI, use the az eventgrid event-subscription create command.

La commande a besoin de l’URL de point de terminaison qui appelle la fonction.The command requires the endpoint URL that invokes the function. L’exemple suivant illustre le modèle d’URL spécifique à la version :The following example shows the version-specific URL pattern:

Runtime de la version 2.x (et ultérieure)Version 2.x (and higher) runtime

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

Runtime de la version 1.xVersion 1.x runtime

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

La clé système est une clé d’autorisation qui doit être incluse dans l’URL de point de terminaison d’un déclencheur Event Grid.The system key is an authorization key that has to be included in the endpoint URL for an Event Grid trigger. La section suivante explique comment l’obtenir.The following section explains how to get the system key.

Voici un exemple d’abonnement à un compte de Stockage Blob (avec un espace réservé pour la clé système) :Here's an example that subscribes to a blob storage account (with a placeholder for the system key):

Runtime de la version 2.x (et ultérieure)Version 2.x (and higher) 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>

Runtime de la version 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>

Pour plus d’informations sur la création d’un abonnement, consultez la section Guide de démarrage rapide sur le Stockage Blob ou les autres guides de démarrage rapide Event Grid.For more information about how to create a subscription, see the blob storage quickstart or the other Event Grid quickstarts.

Obtenir la clé systèmeGet the system key

Vous pouvez obtenir la clé système à l’aide de l’API suivante (HTTP GET) :You can get the system key by using the following API (HTTP GET):

Runtime de la version 2.x (et ultérieure)Version 2.x (and higher) runtime

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

Runtime de la version 1.xVersion 1.x runtime

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

Il s’agit d’une API d’administration, qui a donc besoin de la clé principale de votre application de fonction.This is an admin API, so it requires your function app master key. Ne confondez pas la clé système (permettant d’appeler une fonction de déclenchement Event Grid) avec la clé principale (servant à effectuer des tâches d’administration sur l’application de fonction).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). Veillez à utiliser la clé système pour vous abonner à une rubrique Event Grid.When you subscribe to an Event Grid topic, be sure to use the system key.

Voici un exemple de réponse fournissant la clé système :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}"
    }
  ]
}

Vous pouvez obtenir la clé principale pour votre application de fonction à partir de l’onglet Paramètres de l’application de fonction dans le portail.You can get the master key for your function app from the Function app settings tab in the portal.

Important

La clé principale fournit un accès administrateur à votre application de fonction.The master key provides administrator access to your function app. Ne partagez pas cette clé avec des tiers et ne la distribuez pas dans les applications clientes natives.Don't share this key with third parties or distribute it in native client applications.

Pour plus d’informations, consultez la section Clés d’autorisation dans l’article de référence sur les déclencheurs HTTP.For more information, see Authorization keys in the HTTP trigger reference article.

Vous pouvez également envoyer une requête HTTP PUT pour spécifier la valeur de la clé vous-même.Alternatively, you can send an HTTP PUT to specify the key value yourself.

Tests locaux avec une application web de visionneuseLocal testing with viewer web app

Pour qu’un déclencheur Event Grid soit testé en local, les requêtes HTTP Event Grid doivent partir de leur origine dans le cloud et arriver sur l’ordinateur 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. Vous pouvez pour cela capturer les requêtes en ligne et les renvoyer manuellement sur votre ordinateur local :One way to do that is by capturing requests online and manually resending them on your local machine:

  1. Créez une application web de visionneuse qui capture les messages d’événement.Create a viewer web app that captures event messages.
  2. Créez un abonnement Event Grid qui envoie les événements à l’application de visionneuse.Create an Event Grid subscription that sends events to the viewer app.
  3. Générez une requête et copiez le corps de la requête à partir de l’application de visionneuse.Generate a request and copy the request body from the viewer app.
  4. Publiez (POST) manuellement la requête sur l’URL localhost de votre fonction de déclenchement Event Grid.Manually post the request to the localhost URL of your Event Grid trigger function.

À l’issue des tests, vous pourrez utiliser le même abonnement en production en mettant à jour le point de terminaison.When you're done testing, you can use the same subscription for production by updating the endpoint. Utilisez la commande Azure CLI az eventgrid event-subscription update.Use the az eventgrid event-subscription update Azure CLI command.

Créer une application web de visionneuseCreate a viewer web app

Pour simplifier la capture des messages d’événement, vous pouvez déployer une application web prédéfinie qui affiche les messages d’événement.To simplify capturing event messages, you can deploy a pre-built web app that displays the event messages. La solution déployée comprend un plan App Service, une offre App Service Web Apps et du code source en provenance de GitHub.The deployed solution includes an App Service plan, an App Service web app, and source code from GitHub.

Sélectionnez Déployer sur Azure pour déployer la solution sur votre abonnement.Select Deploy to Azure to deploy the solution to your subscription. Dans le portail Azure, indiquez des valeurs pour les paramètres.In the Azure portal, provide values for the parameters.

Le déploiement peut prendre quelques minutes.The deployment may take a few minutes to complete. Une fois le déploiement réussi, affichez votre application web pour vérifier qu’elle s’exécute.After the deployment has succeeded, view your web app to make sure it's running. Dans un navigateur web, accédez à : https://<your-site-name>.azurewebsites.netIn a web browser, navigate to: https://<your-site-name>.azurewebsites.net

Vous voyez le site, mais aucun événement n’est encore posté sur celui-ci.You see the site but no events have been posted to it yet.

Afficher le nouveau site

Créer un abonnement Event GridCreate an Event Grid subscription

Créez un abonnement Event Grid du type que vous souhaitez tester et attribuez-lui l’URL de votre application web comme point de terminaison pour la notification d’événement.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. Le point de terminaison de votre application web doit inclure le suffixe /api/updates/.The endpoint for your web app must include the suffix /api/updates/. L’URL complète est donc https://<your-site-name>.azurewebsites.net/api/updatesSo, the full URL is https://<your-site-name>.azurewebsites.net/api/updates

Pour plus d’informations sur la création d’abonnements à l’aide du portail Azure, consultez la section Créer un événement personnalisé - Portail Azure dans la documentation 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.

Générer une requêteGenerate a request

Déclenchez un événement qui génèrera du trafic HTTP sur le point de terminaison de votre application web.Trigger an event that will generate HTTP traffic to your web app endpoint. Par exemple, si vous avez créé un abonnement au Stockage Blob, chargez ou supprimez un objet blob.For example, if you created a blob storage subscription, upload or delete a blob. Lorsqu’une requête s’affiche dans votre application web, copiez le corps de la requête.When a request shows up in your web app, copy the request body.

La requête de validation d’abonnement sera reçue la première ; ignorez toutes les requêtes de validation et copiez la requête d’événement.The subscription validation request will be received first; ignore any validation requests, and copy the event request.

Copier le corps de la requête à partir de l’application web

Publier (POST) manuellement la requêteManually post the request

Exécutez votre fonction Event Grid en local.Run your Event Grid function locally.

Utilisez un outil comme Postman ou curl pour créer une requête HTTP POST :Use a tool such as Postman or curl to create an HTTP POST request:

  • Définissez un en-tête Content-Type: application/json.Set a Content-Type: application/json header.
  • Définissez un en-tête aeg-event-type: Notification.Set an aeg-event-type: Notification header.
  • Collez les données RequestBin dans le corps de la requête.Paste the RequestBin data into the request body.
  • Publiez (POST) sur l’URL de votre fonction de déclenchement Event Grid.Post to the URL of your Event Grid trigger function.
    • Pour 2.x et ultérieur, utilisez le modèle suivant :For 2.x and higher use the following pattern:

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

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

Le paramètre functionName doit être le nom spécifié dans l’attribut FunctionName.The functionName parameter must be the name specified in the FunctionName attribute.

Les captures d’écran suivantes montrent les en-têtes et le corps de la requête dans Postman :The following screenshots show the headers and request body in Postman:

En-têtes dans Postman

Corps de la requête dans Postman

La fonction de déclenchement Event Grid s’exécute et affiche des journaux d’activité de ce type :The Event Grid trigger function executes and shows logs similar to the following example:

Exemple de journaux d’activité d’une fonction de déclenchement Event Grid

Tests locaux avec ngrokLocal testing with ngrok

Une autre possibilité, pour tester un déclencheur Event Grid en local, consiste à automatiser la connexion HTTP entre Internet et l’ordinateur de développement.Another way to test an Event Grid trigger locally is to automate the HTTP connection between the Internet and your development computer. Vous pouvez le faire avec un outil tel que ngrok :You can do that with a tool like ngrok:

  1. Créez un point de terminaison ngrok.Create an ngrok endpoint.
  2. Exécutez la fonction de déclenchement Event Grid.Run the Event Grid trigger function.
  3. Créez un abonnement Event Grid qui envoie les événements au point de terminaison ngrok.Create an Event Grid subscription that sends events to the ngrok endpoint.
  4. Déclenchez un événement.Trigger an event.

À l’issue des tests, vous pourrez utiliser le même abonnement en production en mettant à jour le point de terminaison.When you're done testing, you can use the same subscription for production by updating the endpoint. Utilisez la commande Azure CLI az eventgrid event-subscription update.Use the az eventgrid event-subscription update Azure CLI command.

Créer un point de terminaison ngrokCreate an ngrok endpoint

Téléchargez ngrok.exe sur ngrok, et exécutez-le avec la commande suivante :Download ngrok.exe from ngrok, and run with the following command:

ngrok http -host-header=localhost 7071

Le paramètre -host-header est nécessaire, car le runtime de la fonction attend des requêtes de localhost en cas d’exécution sur localhost.The -host-header parameter is needed because the functions runtime expects requests from localhost when it runs on localhost. 7071 est le numéro de port par défaut pour les exécutions en local.7071 is the default port number when the runtime runs locally.

La commande crée une sortie de ce type :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

Vous utiliserez l’URL https://{subdomain}.ngrok.io pour votre abonnement Event Grid.You'll use the https://{subdomain}.ngrok.io URL for your Event Grid subscription.

Exécuter la fonction de déclenchement Event GridRun the Event Grid trigger function

L’URL ngrok ne fait l’objet d’aucun traitement spécial de la part d’Event Grid ; votre fonction doit donc être en cours d’exécution en local lors de la création de l’abonnement.The ngrok URL doesn't get special handling by Event Grid, so your function must be running locally when the subscription is created. À défaut, la réponse de validation ne serait pas envoyée et la création de l’abonnement échouerait.If it isn't, the validation response doesn't get sent and the subscription creation fails.

Création d’un abonnementCreate a subscription

Créez un abonnement Event Grid du type à tester, et donnez-lui votre point de terminaison ngrok.Create an Event Grid subscription of the type you want to test, and give it your ngrok endpoint.

Utilisez ce modèle de point de terminaison pour Functions 2.x et ultérieur :Use this endpoint pattern for Functions 2.x and higher:

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

Utilisez ce modèle de point de terminaison pour Functions 1.x :Use this endpoint pattern for Functions 1.x:

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

Le paramètre {FUNCTION_NAME} doit être le nom spécifié dans l’attribut FunctionName.The {FUNCTION_NAME} parameter must be the name specified in the FunctionName attribute.

Voici un exemple utilisant Azure CLI :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

Pour plus d’informations sur la création d’abonnements, consultez la section Créer un abonnement au début de cet article.For information about how to create a subscription, see Create a subscription earlier in this article.

Déclencher un événementTrigger an event

Déclenchez un événement qui génèrera du trafic HTTP sur votre point de terminaison ngrok.Trigger an event that will generate HTTP traffic to your ngrok endpoint. Par exemple, si vous avez créé un abonnement au Stockage Blob, chargez ou supprimez un objet blob.For example, if you created a blob storage subscription, upload or delete a blob.

La fonction de déclenchement Event Grid s’exécute et affiche des journaux d’activité de ce type :The Event Grid trigger function executes and shows logs similar to the following example:

Exemple de journaux d’activité d’une fonction de déclenchement Event Grid

Utiliser un déclencheur HTTP comme déclencheur Event GridUse an HTTP trigger as an Event Grid trigger

Les événements Event Grid sont reçus en tant que requêtes HTTP, ce qui permet de les gérer à l’aide d’un déclencheur HTTP au lieu d’un déclencheur 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. par exemple, afin de mieux maîtriser l’URL de point de terminaison qui appelle la fonction.One possible reason for doing that is to get more control over the endpoint URL that invokes the function. Ou encore lorsque vous devez recevoir des événements dans le schéma CloudEvents.Another reason is when you need to receive events in the CloudEvents schema. Actuellement, le déclencheur Event Grid ne prend pas en charge le schéma CloudEvents.Currently, the Event Grid trigger doesn't support the CloudEvents schema. Les exemples de cette section présentent des solutions pour les schémas Event Grid et CloudEvents.The examples in this section show solutions for both Event Grid schema and CloudEvents schema.

Si vous utilisez un déclencheur HTTP, vous devrez écrire du code pour accomplir les actions que le déclencheur Event Grid effectue automatiquement :If you use an HTTP trigger, you have to write code for what the Event Grid trigger does automatically:

  • Envoyer une réponse de validation à une requête de validation d’abonnement.Sends a validation response to a subscription validation request.
  • Appeler la fonction une fois par élément du tableau d’événements contenu dans le corps de la requête.Invokes the function once per element of the event array contained in the request body.

Pour plus d’informations sur l’URL à utiliser pour appeler la fonction en local ou en cas d’exécution dans Azure, consultez la documentation de référence des liaisons de déclencheurs 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

Schéma Event GridEvent Grid schema

L’exemple de code C# suivant pour un déclencheur HTTP simule le comportement d’un déclencheur Event Grid.The following sample C# code for an HTTP trigger simulates Event Grid trigger behavior. Utilisez cet exemple pour les événements remis dans le schéma 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);
}

L’exemple de code JavaScript suivant pour un déclencheur HTTP simule le comportement d’un déclencheur Event Grid.The following sample JavaScript code for an HTTP trigger simulates Event Grid trigger behavior. Utilisez cet exemple pour les événements remis dans le schéma 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();
};

Le code de gestion des événements s’intègre à la boucle par le biais du tableau messages.Your event-handling code goes inside the loop through the messages array.

Schéma CloudEventsCloudEvents schema

L’exemple de code C# suivant pour un déclencheur HTTP simule le comportement d’un déclencheur Event Grid.The following sample C# code for an HTTP trigger simulates Event Grid trigger behavior. Utilisez cet exemple pour les événements remis dans le schéma 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);
}

L’exemple de code JavaScript suivant pour un déclencheur HTTP simule le comportement d’un déclencheur Event Grid.The following sample JavaScript code for an HTTP trigger simulates Event Grid trigger behavior. Utilisez cet exemple pour les événements remis dans le schéma 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();
};

Étapes suivantesNext steps