Sdílet prostřednictvím


Trigger Služby Azure Event Grid pro Azure Functions

Pomocí triggeru funkce můžete reagovat na událost odeslanou zdrojem Event Gridu. Abyste mohli přijímat události, musíte mít odběr události zdroje. Informace o vytvoření odběru událostí najdete v tématu Vytvoření odběru. Informace o nastavení vazby a konfiguraci najdete v přehledu.

Poznámka:

Triggery služby Event Grid nejsou nativně podporovány v interním prostředí služby App Service Environment (ASE) nástroje pro vyrovnávání zatížení. Trigger používá požadavek HTTP, který se nemůže spojit s aplikací funkcí bez brány do virtuální sítě.

Důležité

Tento článek používá karty pro podporu více verzí programovacího modelu Node.js. Model v4 je obecně dostupný a je navržený tak, aby měl flexibilnější a intuitivnější prostředí pro vývojáře v JavaScriptu a TypeScriptu. Další podrobnosti o tom, jak model v4 funguje, najdete v příručce pro vývojáře služby Azure Functions Node.js. Další informace o rozdílech mezi v3 a v4 najdete v průvodci migrací.

Azure Functions podporuje dva programovací modely pro Python. Způsob, jakým definujete vazby, závisí na zvoleném programovacím modelu.

Programovací model Pythonu v2 umožňuje definovat vazby pomocí dekorátorů přímo v kódu funkce Pythonu. Další informace najdete v příručce pro vývojáře Pythonu.

Tento článek podporuje oba programovací modely.

Příklad

Příklad triggeru HTTP najdete v tématu Příjem událostí do koncového bodu HTTP.

Typ vstupního parametru použitého s triggerem Event Gridu závisí na těchto třech faktorech:

  • Verze modulu runtime služby Functions
  • Verze rozšíření vazby
  • Způsob fungování funkce jazyka C#.

Funkci jazyka C# je možné vytvořit pomocí jednoho z následujících režimů jazyka C#:

  • Izolovaný model pracovního procesu: Kompilovaná funkce jazyka C#, která běží v pracovním procesu, který je izolovaný od modulu runtime. Izolovaný pracovní proces je nutný pro podporu funkcí C# spuštěných na LTS a jiných verzích než LTS .NET a rozhraní .NET Framework. Rozšíření pro izolované funkce pracovních procesů používají Microsoft.Azure.Functions.Worker.Extensions.* obory názvů.
  • Model v procesu: Zkompilovaná funkce jazyka C#, která běží ve stejném procesu jako modul runtime služby Functions. Ve variantě tohoto modelu je možné spouštět funkce pomocí skriptování jazyka C#, což je podporováno především pro úpravy portálu C#. Rozšíření pro procesní funkce používají Microsoft.Azure.WebJobs.Extensions.* obory názvů.

Při spuštění funkce jazyka C# v izolovaném pracovním procesu je potřeba definovat vlastní typ pro vlastnosti události. Následující příklad definuje MyEventType třídu.

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

Následující příklad ukazuje, jak se vlastní typ používá v triggeru i ve výstupní vazbě Event Gridu:

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

Tato část obsahuje následující příklady:

Následující příklady ukazují vazbu triggeru v Javě , která používá vazbu a vygeneruje událost, nejprve přijímá událost jako String pojo a druhou jako POJO.

Trigger Event Gridu, parametr String

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

Trigger Event Gridu, parametr POJO

V tomto příkladu se používá následující POJO představující vlastnosti nejvyšší úrovně události Event Gridu:

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;

}

Při příjezdu se datová část JSON události de serializuje do EventSchema POJO pro použití funkcí. Tento proces umožňuje funkci přistupovat k vlastnostem události objektově orientovaným způsobem.

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

V knihovně modulu runtime funkcí Java použijte poznámku EventGridTrigger k parametrům, jejichž hodnota pochází z Event Gridu. Parametry s těmito poznámkami způsobí, že se funkce spustí při příchodu události. Tuto poznámku lze použít s nativními typy Javy, POJOs nebo hodnotami null s použitím Optional<T>.

Následující příklad ukazuje funkci TypeScript triggeru event gridu.

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

Následující příklad ukazuje funkci JavaScriptu triggeru event gridu.

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

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

Následující příklad ukazuje, jak nakonfigurovat vazbu triggeru Event Gridu v souboru function.json .

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

Událost Event Gridu je k dispozici funkci prostřednictvím parametru s názvem eventGridEvent, jak je znázorněno v následujícím příkladu PowerShellu.

param($eventGridEvent, $TriggerMetadata)

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

Následující příklad ukazuje vazbu triggeru Event Gridu a funkci Pythonu, která tuto vazbu používá. Tento příklad závisí na tom, jestli používáte programovací model v1 nebo v2 Pythonu.

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)

Atributy

Knihovny C# v procesu i izolovaného pracovního procesu používají atribut EventGridTrigger. Skript jazyka C# místo toho používá konfigurační soubor function.json, jak je popsáno v průvodci skriptováním jazyka C#.

Tady je EventGridTrigger atribut v podpisu metody:

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

Poznámky

Poznámka EventGridTrigger umožňuje deklarativní konfiguraci vazby Event Gridu poskytnutím hodnot konfigurace. Další podrobnosti najdete v příkladu a částech konfigurace.

Konfigurace

Objekt options předaný app.eventGrid() metodě v současné době nepodporuje žádné vlastnosti modelu v4.

Konfigurace

Následující tabulka vysvětluje vlastnosti konfigurace vazby, které jste nastavili v souboru function.json . V atributu nejsou nastaveny žádné parametry ani vlastnosti konstruktoru EventGridTrigger .

vlastnost function.json Popis
type Povinné – musí být nastaveno na eventGridTriggerhodnotu .
direction Povinné – musí být nastaveno na inhodnotu .
Jméno Povinné – název proměnné použité v kódu funkce pro parametr, který přijímá data události.

Kompletní příklady najdete v části Příklad.

Využití

Trigger služby Event Grid používá požadavek HTTP webhooku, který lze nakonfigurovat pomocí stejného nastavení host.json jako trigger HTTP.

Typ parametru podporovaný triggerem Event Gridu závisí na verzi modulu runtime služby Functions, verzi balíčku rozšíření a použitém způsobu použití jazyka C#.

Pokud chcete, aby funkce zpracovávala jednu událost, trigger Event Gridu může svázat s následujícími typy:

Typ Popis
Serializovatelné typy JSON Funkce se pokusí deserializovat data JSON události do prostého typu objektu CLR (POCO).
string Událost jako řetězec.
BinaryData1 Bajty zprávy události.
CloudEvent1 Objekt události. Používá se, když je Event Grid nakonfigurovaný tak, aby doručoval pomocí schématu CloudEvents.
EventGridEvent1 Objekt události. Používá se, když je Event Grid nakonfigurovaný tak, aby doručoval pomocí schématu Event Gridu.

Pokud chcete, aby funkce zpracovávala dávku událostí, trigger Event Gridu může svázat s následujícími typy:

Typ Popis
CloudEvent[]1,
EventGridEvent[]1,
string[],
BinaryData[]1
Pole událostí z dávky. Každá položka představuje jednu událost.

1 Pokud chcete použít tyto typy, musíte odkazovat na Microsoft.Azure.Functions.Worker.Extensions.EventGrid 3.3.0 nebo novější a běžné závislosti pro vazby typu sady SDK.

Instance události Event Gridu je k dispozici prostřednictvím parametru přidruženého k atributuEventGridTrigger, který je zadán jako .EventSchema

Instance Event Gridu je k dispozici prostřednictvím parametru nakonfigurovaného ve vlastnosti souboru function.jsonname.

Instance Event Gridu je k dispozici prostřednictvím parametru nakonfigurovaného ve vlastnosti souboru function.jsonname, která je zadána jako func.EventGridEvent.

Schéma událostí

Data události Event Gridu se přijímají jako objekt JSON v textu požadavku HTTP. Json vypadá podobně jako v následujícím příkladu:

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

Zobrazený příklad je pole jednoho prvku. Event Grid vždy odesílá pole a může posílat více než jednu událost v poli. Modul runtime vyvolá vaši funkci jednou pro každý prvek pole.

Vlastnosti nejvyšší úrovně v datech JSON události jsou stejné mezi všemi typy událostí, zatímco obsah data vlastnosti je specifický pro každý typ události. Příklad je určený pro událost úložiště objektů blob.

Vysvětlení běžných vlastností a vlastností specifických pro události najdete v dokumentaci k Event Gridu.

Další kroky