Delen via


CloudEvents v1.0-schema met Azure Event Grid

Azure Event Grid biedt systeemeigen ondersteuning voor gebeurtenissen in de JSON-implementatie van CloudEvents v1.0 en HTTP-protocolbinding. CloudEvents is een open specificatie voor het beschrijven van gebeurtenisgegevens. CloudEvents vereenvoudigt de interoperabiliteit door een gemeenschappelijk gebeurtenisschema te bieden voor het publiceren en gebruiken van cloudgebeurtenissen. Dit schema biedt uniforme tooling, standaard manieren voor routering en verwerking van gebeurtenissen en universele manieren om het buitenste gebeurtenisschema te deserialiseren. Met een gemeenschappelijk schema kunt u eenvoudiger werk op verschillende platforms integreren.

CloudEvents wordt gebouwd door verschillende medewerkers, waaronder Microsoft, via de Cloud Native Computing Foundation. Het is momenteel beschikbaar als versie 1.0.

In dit artikel wordt beschreven hoe u een CloudEvents-schema gebruikt met Event Grid.

Voorbeeldgebeurtenis met cloudEvents-schema

Hier volgt een voorbeeld van een Azure Blob Storage-gebeurtenis in de CloudEvents-indeling:

{
    "specversion": "1.0",
    "type": "Microsoft.Storage.BlobCreated",  
    "source": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}",
    "id": "9aeb0fdf-c01e-0131-0922-9eb54906e209",
    "time": "2019-11-18T15:13:39.4589254Z",
    "subject": "blobServices/default/containers/{storage-container}/blobs/{new-file}",    
    "data": {
        "api": "PutBlockList",
        "clientRequestId": "4c5dd7fb-2c48-4a27-bb30-5361b5de920a",
        "requestId": "9aeb0fdf-c01e-0131-0922-9eb549000000",
        "eTag": "0x8D76C39E4407333",
        "contentType": "image/png",
        "contentLength": 30699,
        "blobType": "BlockBlob",
        "url": "https://gridtesting.blob.core.windows.net/testcontainer/{new-file}",
        "sequencer": "000000000000000000000000000099240000000000c41c18",
        "storageDiagnostics": {
            "batchId": "681fe319-3006-00a8-0022-9e7cde000000"
        }
    }
}

Hier vindt u een gedetailleerde beschrijving van de beschikbare velden, de bijbehorende typen en definities in CloudEvents v1.0.

De headerwaarden voor gebeurtenissen die worden geleverd in het CloudEvents-schema en het Event Grid-schema zijn hetzelfde, met uitzondering van content-type. Voor het CloudEvents-schema is "content-type":"application/cloudevents+json; charset=utf-8"die headerwaarde . Voor het Event Grid-schema is "content-type":"application/json; charset=utf-8"die headerwaarde .

Configuratie voor CloudEvents

U kunt Event Grid gebruiken voor zowel invoer als uitvoer van gebeurtenissen in het CloudEvents-schema. U kunt CloudEvents gebruiken voor systeemevenementen, zoals Blob Storage-gebeurtenissen en IoT Hub-gebeurtenissen en aangepaste gebeurtenissen. Naast het ondersteunen van CloudEvents ondersteunt Event Grid een eigen, nonextensible, maar volledig functionele Event Grid-gebeurtenisindeling. In de volgende tabel wordt de transformatie beschreven die wordt ondersteund bij het gebruik van CloudEvents en Event Grid-indelingen als invoerschema in onderwerpen en als een uitvoerschema in gebeurtenisabonnementen. Een Event Grid-uitvoerschema kan niet worden gebruikt bij het gebruik van CloudEvents als invoerschema omdat CloudEvents extensiekenmerken ondersteunt die niet worden ondersteund door het Event Grid-schema.

Invoerschema Uitvoerschema
CloudEvents-indeling CloudEvents-indeling
Event Grid-indeling CloudEvents-indeling
Event Grid-indeling Event Grid-indeling

Voor alle gebeurtenisschema's vereist Event Grid validatie bij het publiceren naar een Event Grid-onderwerp en bij het maken van een gebeurtenisabonnement. Zie Event Grid-beveiliging en -verificatie voor meer informatie.

Invoerschema

U stelt het invoerschema voor een aangepast onderwerp in wanneer u het aangepaste onderwerp maakt met behulp van de input-schema parameter.

Gebruik voor de Azure CLI het volgende:

az eventgrid topic create --name demotopic -l westcentralus -g gridResourceGroup --input-schema cloudeventschemav1_0

Gebruik voor PowerShell:

New-AzEventGridTopic -ResourceGroupName gridResourceGroup -Location westcentralus -Name demotopic -InputSchema CloudEventSchemaV1_0

Uitvoerschema

U stelt het uitvoerschema in wanneer u het gebeurtenisabonnement maakt met behulp van de event-delivery-schema parameter.

Gebruik voor de Azure CLI het volgende:

topicID=$(az eventgrid topic show --name demotopic -g gridResourceGroup --query id --output tsv)

az eventgrid event-subscription create --name demotopicsub --source-resource-id $topicID --endpoint <endpoint_URL> --event-delivery-schema cloudeventschemav1_0

Gebruik voor PowerShell:

$topicid = (Get-AzEventGridTopic -ResourceGroupName gridResourceGroup -Name <topic-name>).Id

New-AzEventGridSubscription -ResourceId $topicid -EventSubscriptionName <event_subscription_name> -Endpoint <endpoint_URL> -DeliverySchema CloudEventSchemaV1_0

Gebruiken met Azure Functions

Visual Studio of Visual Studio Code

Als u Visual Studio of Visual Studio Code en de C#-programmeertaal gebruikt om functies te ontwikkelen, moet u ervoor zorgen dat u het nieuwste Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet-pakket (versie 3.3.1 of hoger) gebruikt.

Gebruik in Visual Studio de Tools ->NuGet Pakketbeheer ->Pakketbeheer Console en voer de Install-Package opdracht (Install-Package Microsoft.Azure.WebJobs.Extensions.EventGrid -Version 3.3.1). U kunt ook met de rechtermuisknop op het project klikken in het venster Solution Explorer en het menu NuGet-pakketten beheren selecteren om naar het NuGet-pakket te bladeren en het te installeren of bij te werken naar de nieuwste versie.

Werk in VS Code het versienummer voor het pakket Microsoft.Azure.WebJobs.Extensions.EventGrid bij in het csproj-bestand voor uw Azure Functions-project.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.EventGrid" Version="3.3.1" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.1" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

In het volgende voorbeeld ziet u een Azure Functions-functie versie 3.x die is ontwikkeld in Visual Studio of Visual Studio Code. Het maakt gebruik van een CloudEvent bindingsparameter en EventGridTrigger.

using Azure.Messaging;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public static class CloudEventTriggerFunction
    {
        [FunctionName("CloudEventTriggerFunction")]
        public static void Run(ILogger logger, [EventGridTrigger] CloudEvent e)
        {
            logger.LogInformation("Event received {type} {subject}", e.Type, e.Subject);
        }
    }
}

Ontwikkelervaring in Azure Portal

Als u Azure Portal gebruikt om een Azure-functie te ontwikkelen, voert u de volgende stappen uit:

  1. Werk de naam van de parameter in function.json het bestand bij naar cloudEvent.

    {
      "bindings": [
        {
          "type": "eventGridTrigger",
          "name": "cloudEvent",
          "direction": "in"
        }
      ]
    }    
    
  2. Werk het run.csx bestand bij zoals wordt weergegeven in de volgende voorbeeldcode.

    #r "Azure.Core"
    
    using Azure.Messaging;
    
    public static void Run(CloudEvent cloudEvent, ILogger logger)
    {
        logger.LogInformation("Event received {type} {subject}", cloudEvent.Type, cloudEvent.Subject);
    }
    

Notitie

Zie de Azure Event Grid-trigger voor Azure Functions voor meer informatie.

Zie Eindpuntvalidatie met CloudEvents 1.0 voor informatie over eindpuntvalidatie met CloudEvents.