Azure Event Grid-trigger voor Azure Functions

Gebruik de functietrigger om te reageren op een gebeurtenis die is verzonden door een Event Grid-bron. U moet een gebeurtenisabonnement hebben op de bron om gebeurtenissen te kunnen ontvangen. Zie Een abonnement maken voor meer informatie over het maken van een gebeurtenisabonnement. Zie het overzicht voor informatie over het instellen en configureren van bindingen.

Notitie

Event Grid-triggers worden niet systeemeigen ondersteund in een interne Load Balancer App Service Environment (ASE). De trigger maakt gebruik van een HTTP-aanvraag die de functie-app niet kan bereiken zonder een gateway in het virtuele netwerk.

Belangrijk

In dit artikel worden tabbladen gebruikt ter ondersteuning van meerdere versies van het Node.js programmeermodel. Het v4-model is algemeen beschikbaar en is ontworpen voor een flexibelere en intuïtievere ervaring voor JavaScript- en TypeScript-ontwikkelaars. Raadpleeg de ontwikkelaarshandleiding voor Azure Functions Node.js voor meer informatie over hoe het v4-model werkt. Raadpleeg de migratiehandleiding voor meer informatie over de verschillen tussen v3 en v4.

Azure Functions ondersteunt twee programmeermodellen voor Python. De manier waarop u uw bindingen definieert, is afhankelijk van het gekozen programmeermodel.

Met het Python v2-programmeermodel kunt u bindingen definiëren met behulp van decorators rechtstreeks in uw Python-functiecode. Zie de Ontwikkelaarshandleiding voor Python voor meer informatie.

Dit artikel ondersteunt beide programmeermodellen.

Opmerking

Zie Gebeurtenissen ontvangen naar een HTTP-eindpunt voor een voorbeeld van een HTTP-trigger.

Het type invoerparameter dat wordt gebruikt met een Event Grid-trigger, is afhankelijk van deze drie factoren:

  • Runtimeversie van Functions
  • Versie van bindingsextensie
  • Modaliteit van de C#-functie.

U kunt een C#-functie maken met behulp van een van de volgende C#-modi:

  • Geïsoleerd werkrolmodel: gecompileerde C#-functie die wordt uitgevoerd in een werkproces dat is geïsoleerd van de runtime. Geïsoleerd werkproces is vereist voor de ondersteuning van C#-functies die worden uitgevoerd op LTS- en niet-LTS-versies .NET en .NET Framework. Extensies voor geïsoleerde werkprocesfuncties maken gebruik van Microsoft.Azure.Functions.Worker.Extensions.* naamruimten.
  • In-process model: gecompileerde C#-functie die wordt uitgevoerd in hetzelfde proces als de Functions-runtime. In een variatie van dit model kunnen functies worden uitgevoerd met behulp van C#-scripting. Dit wordt voornamelijk ondersteund voor het bewerken van de C#-portal. Extensies voor in-process-functies maken gebruik van Microsoft.Azure.WebJobs.Extensions.* naamruimten.

Wanneer u de C#-functie uitvoert in een geïsoleerd werkproces, moet u een aangepast type definiëren voor gebeurteniseigenschappen. In het volgende voorbeeld wordt een MyEventType klasse gedefinieerd.

    public class MyEventType
    {
        public string Id { get; set; }

        public string Topic { get; set; }

        public string Subject { get; set; }

        public string EventType { get; set; }

        public DateTime EventTime { get; set; }

        public IDictionary<string, object> Data { get; set; }
    }
}

In het volgende voorbeeld ziet u hoe het aangepaste type wordt gebruikt in zowel de trigger als een Event Grid-uitvoerbinding:

public static class EventGridFunction
{
    [Function(nameof(EventGridFunction))]
    [EventGridOutput(TopicEndpointUri = "MyEventGridTopicUriSetting", TopicKeySetting = "MyEventGridTopicKeySetting")]
    public static MyEventType Run([EventGridTrigger] MyEventType input, FunctionContext context)
    {
        var logger = context.GetLogger(nameof(EventGridFunction));

        logger.LogInformation(input.Data.ToString());

        var outputEvent = new MyEventType()
        {
            Id = "unique-id",
            Subject = "abc-subject",
            Data = new Dictionary<string, object>
            {
                { "myKey", "myValue" }
            }
        };

        return outputEvent;
    }
}

Deze sectie bevat de volgende voorbeelden:

In de volgende voorbeelden ziet u triggerbinding in Java die de binding gebruiken en een gebeurtenis genereren, waarbij eerst de gebeurtenis als String en tweede als POJO wordt ontvangen.

Event Grid-trigger, tekenreeksparameter

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

Event Grid-trigger, POJO-parameter

In dit voorbeeld wordt de volgende POJO gebruikt, die de eigenschappen op het hoogste niveau van een Event Grid-gebeurtenis vertegenwoordigt:

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;

}

Bij aankomst wordt de JSON-nettolading van de gebeurtenis gedeserialiseerd in de EventSchema POJO voor gebruik door de functie. Met dit proces heeft de functie toegang tot de eigenschappen van de gebeurtenis op een objectgeoriënteerde manier.

  @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);
  }

Gebruik in de Runtime-bibliotheek van Java-functies de EventGridTrigger aantekening voor parameters waarvan de waarde afkomstig is van Event Grid. Door parameters met deze aantekeningen wordt de functie uitgevoerd wanneer er een gebeurtenis optreedt. Deze aantekening kan worden gebruikt met systeemeigen Java-typen, POJO's of nullbare waarden met Optional<T>.

In het volgende voorbeeld ziet u een TypeScript-functie voor een Event Grid-trigger.

import { app, EventGridEvent, InvocationContext } from '@azure/functions';

export async function eventGridTrigger1(event: EventGridEvent, context: InvocationContext): Promise<void> {
    context.log('Event grid function processed event:', event);
}

app.eventGrid('eventGridTrigger1', {
    handler: eventGridTrigger1,
});

In het volgende voorbeeld ziet u een JavaScript-functie voor een event grid-trigger.

const { app } = require('@azure/functions');

app.eventGrid('eventGridTrigger1', {
    handler: (event, context) => {
        context.log('Event grid function processed event:', event);
    },
});

In het volgende voorbeeld ziet u hoe u een Event Grid-triggerbinding configureert in het function.json-bestand .

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

De Event Grid-gebeurtenis wordt beschikbaar gesteld voor de functie via een parameter met de naam eventGridEvent, zoals wordt weergegeven in het volgende PowerShell-voorbeeld.

param($eventGridEvent, $TriggerMetadata)

# Make sure to pass hashtables to Out-String so they're logged correctly
$eventGridEvent | Out-String | Write-Host

In het volgende voorbeeld ziet u een Event Grid-triggerbinding en een Python-functie die gebruikmaakt van de binding. Het voorbeeld is afhankelijk van of u het python-programmeermodel v1 of v2 gebruikt.

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="eventGridTrigger")
@app.event_grid_trigger(arg_name="event")
def eventGridTest(event: func.EventGridEvent):
    result = json.dumps({
        'id': event.id,
        'data': event.get_json(),
        'topic': event.topic,
        'subject': event.subject,
        'event_type': event.event_type,
    })

    logging.info('Python EventGrid trigger processed an event: %s', result)

Kenmerken

C #-bibliotheken voor zowel in-process - als geïsoleerde werkprocessen maken gebruik van het kenmerk EventGridTrigger . C#-script maakt in plaats daarvan gebruik van een function.json configuratiebestand, zoals beschreven in de handleiding voor C#-scripts.

Hier volgt een EventGridTrigger kenmerk in een methodehandtekening:

[Function(nameof(EventGridFunction))]
[EventGridOutput(TopicEndpointUri = "MyEventGridTopicUriSetting", TopicKeySetting = "MyEventGridTopicKeySetting")]
public static MyEventType Run([EventGridTrigger] MyEventType input, FunctionContext context)
{

Aantekeningen

Met de annotatie van EventGridTrigger kunt u een Event Grid-binding declaratief configureren door configuratiewaarden op te geven. Zie de voorbeeld - en configuratiesecties voor meer informatie.

Configuratie

Het options object dat aan de app.eventGrid() methode wordt doorgegeven, biedt momenteel geen ondersteuning voor eigenschappen voor model v4.

Configuratie

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u in het function.json-bestand hebt ingesteld. Er zijn geen constructorparameters of eigenschappen die moeten worden ingesteld in het EventGridTrigger kenmerk.

function.json-eigenschap Beschrijving
type Vereist - moet worden ingesteld op eventGridTrigger.
direction Vereist - moet worden ingesteld op in.
name Vereist: de variabelenaam die wordt gebruikt in functiecode voor de parameter die de gebeurtenisgegevens ontvangt.

Zie de sectie Voorbeeld voor volledige voorbeelden.

Gebruik

De Event Grid-trigger maakt gebruik van een WEBhook HTTP-aanvraag, die kan worden geconfigureerd met dezelfde host.json instellingen als de HTTP-trigger.

Het parametertype dat wordt ondersteund door de Event Grid-trigger, is afhankelijk van de runtimeversie van Functions, de versie van het extensiepakket en de gebruikte C#-modaliteit.

Wanneer u wilt dat de functie één gebeurtenis verwerkt, kan de Event Grid-trigger worden gekoppeld aan de volgende typen:

Type Description
JSON serialiseerbare typen Functions probeert de JSON-gegevens van de gebeurtenis te deserialiseren in een niet-oud CLR-objecttype (POCO).
string De gebeurtenis als een tekenreeks.
BinaryData1 De bytes van het gebeurtenisbericht.
CloudEvent1 Het gebeurtenisobject. Gebruik deze functie wanneer Event Grid is geconfigureerd voor levering met behulp van het CloudEvents-schema.
EventGridEvent1 Het gebeurtenisobject. Gebruik deze functie wanneer Event Grid is geconfigureerd voor levering met behulp van het Event Grid-schema.

Wanneer u wilt dat de functie een batch gebeurtenissen verwerkt, kan de Event Grid-trigger worden gekoppeld aan de volgende typen:

Type Description
CloudEvent[]1,
EventGridEvent[]1,
string[],
BinaryData[]1
Een matrix met gebeurtenissen uit de batch. Elke vermelding vertegenwoordigt één gebeurtenis.

1 Als u deze typen wilt gebruiken, moet u verwijzen naar Microsoft.Azure.Functions.Worker.Extensions.EventGrid 3.3.0 of hoger en de algemene afhankelijkheden voor SDK-typebindingen.

Het Event Grid-gebeurtenisexemplaar is beschikbaar via de parameter die is gekoppeld aan het EventGridTrigger kenmerk, getypt als een EventSchema.

Het Event Grid-exemplaar is beschikbaar via de parameter die is geconfigureerd in de eigenschap van het function.json-bestandname.

Het Event Grid-exemplaar is beschikbaar via de parameter die is geconfigureerd in de eigenschap van het function.json-bestand, getypt als func.EventGridEvent.name

Gebeurtenisschema

Gegevens voor een Event Grid-gebeurtenis worden ontvangen als een JSON-object in de hoofdtekst van een HTTP-aanvraag. De JSON ziet er ongeveer als volgt uit:

[{
  "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"
}]

Het weergegeven voorbeeld is een matrix van één element. Event Grid verzendt altijd een matrix en kan meer dan één gebeurtenis in de matrix verzenden. De runtime roept uw functie eenmaal aan voor elk matrixelement.

De eigenschappen op het hoogste niveau in de JSON-gegevens van de gebeurtenis zijn hetzelfde voor alle gebeurtenistypen, terwijl de inhoud van de data eigenschap specifiek is voor elk gebeurtenistype. Het voorbeeld dat wordt weergegeven, is bedoeld voor een blobopslag-gebeurtenis.

Zie Gebeurteniseigenschappen in de Documentatie van Event Grid voor uitleg over de algemene en gebeurtenisspecifieke eigenschappen.

Volgende stappen