Поделиться через


Триггер службы "Сетка событий Azure" для Функций Azure

Используйте триггер функции для реагирования на событие, отправленное источником Сетки событий. Для получения событий у вас должна быть подписка на события в источнике. Чтобы узнать, как создать подписку на событие, см. раздел Создание подписки. Сведения о конфигурации и настройке привязки см. в этой обзорной статье.

Примечание.

Триггеры "Сетка событий" изначально не поддерживаются во внутренней подсистеме балансировки нагрузки для Среды службы приложений. Триггер использует HTTP-запрос, который не может подключиться к приложению функции без шлюза в виртуальной сети.

Внимание

В этой статье используются вкладки для поддержки нескольких версий модели программирования Node.js. Модель версии 4 общедоступна и предназначена для более гибкого и интуитивно понятного интерфейса для разработчиков JavaScript и TypeScript. Дополнительные сведения о том, как работает модель версии 4, см. в руководстве разработчика по Функции Azure Node.js. Дополнительные сведения о различиях между версиями 3 и 4 см. в руководстве по миграции.

Функции Azure поддерживает две модели программирования для Python. Способ определения привязок зависит от выбранной модели программирования.

Модель программирования Python версии 2 позволяет определять привязки с помощью декораторов непосредственно в коде функции Python. Дополнительные сведения см. в руководстве разработчика Python.

Эта статья поддерживает обе модели программирования.

Пример

Пример триггера HTTP можно изучить в статье Получение событий через конечную точку HTTP.

Тип входного параметра, используемого с триггером "Сетка событий", зависит от следующих трех факторов:

  • Версия среды выполнения службы "Функции Azure"
  • Версия расширения привязки
  • Модальность функции C#.

Функцию C# можно создать с помощью одного из следующих режимов C#:

  • Изолированная рабочая модель: скомпилированная функция C#, которая выполняется в рабочем процессе, изолированном от среды выполнения. Изолированный рабочий процесс необходим для поддержки функций C#, работающих в LTS и не LTS-версиях .NET и платформа .NET Framework. Расширения для изолированных рабочих процессов используют Microsoft.Azure.Functions.Worker.Extensions.* пространства имен.
  • Модель внутрипроцессного процесса: скомпилированная функция C#, которая выполняется в том же процессе, что и среда выполнения Функций. В варианте этой модели функции можно запускать с помощью скриптов C#, которая поддерживается главным образом для редактирования портала C#. Расширения для функций в процессе используют Microsoft.Azure.WebJobs.Extensions.* пространства имен.

При запуске функции C# в изолированном рабочем процессе необходимо определить настраиваемый тип для свойств событий. В следующем примере определяется класс MyEventType.

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

В следующем примере показано, как пользовательский тип используется в триггере и в выходной привязке сетки событий:

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

Этот раздел содержит следующие примеры.

В следующих примерах демонстрируется привязка триггера в Java с использованием привязки, которая генерирует событие. Здесь событие сначала принимается как String, затем — как POJO.

Триггер Сетки событий, параметр String

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

Триггер Сетки событий, параметр POJO

В этом примере используется следующий POJO, представляющий свойства верхнего уровня события сетки событий.

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;

}

По прибытии полезные данные JSON события десериализуются в EventSchema POJO для использования функцией. Этот процесс позволяет функции использовать свойства событий в объектно-ориентированном стиле.

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

В библиотеке среды выполнения функций Java используйте заметку EventGridTrigger для параметров, значения которых будут поступать из Сетки событий. Параметры с этими заметками запускают функцию, когда происходит событие. Эта заметка может использоваться с собственными типами Java, объектами POJO или значениями, допускающими значения NULL, используя Optional<T>.

В следующем примере показана функция триггера TypeScript сетки событий.

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

В следующем примере показана функция JavaScript с триггером сетки событий.

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

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

В следующем примере показано, как настроить привязку триггера для Сетки событий в файле function.json.

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

Событие Сетки событий становится доступным для функции через параметр с именем eventGridEvent, как показано в следующем примере PowerShell.

param($eventGridEvent, $TriggerMetadata)

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

В следующем примере показана привязка триггера сетки событий и функция Python, использующая привязку. Пример зависит от того, используется ли модель программирования Python версии 1 или версии 2.

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)

Атрибуты

Библиотеки C# в процессе и изолированном рабочем процессе используют атрибут EventGridTrigger . Вместо этого скрипт C# использует файл конфигурации function.json, как описано в руководстве по скриптам C#.

Вот как выглядит атрибут EventGridTrigger в сигнатуре метода:

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

Заметки

Аннотация EventGridTrigger позволяет декларативно настроить привязку Сетки событий, предоставив значения конфигурации. Дополнительные сведения см. в разделах примера и конфигурации.

Настройка

Объект, options переданный методу в app.eventGrid() настоящее время, не поддерживает какие-либо свойства для модели версии 4.

Настройка

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json. В атрибуте EventGridTrigger не задаются параметры или свойства конструкции.

Свойство в function.json Описание
type Обязательное. Необходимо задать значение eventGridTrigger.
direction Обязательное. Необходимо задать значение in.
name Обязательное. Имя переменной, используемой в коде функции, для параметра, получающего данные события.

Подробные примеры см. в разделе Примеры.

Использование

Триггер сетки событий использует HTTP-запрос веб-перехватчика, который можно настроить с помощью того же host.json параметров, что и триггер HTTP.

Тип параметра, поддерживаемый триггером сетки событий, зависит от версии среды выполнения Функций, версии пакета расширения и используемой модальности C#.

Если требуется, чтобы функция обрабатывала одно событие, триггер сетки событий может привязаться к следующим типам:

Тип Описание
Сериализуемые в JSON типы Функции пытаются десериализировать данные JSON события в обычный тип объекта CLR (POCO).
string Событие в виде строки.
BinaryData1 Байт сообщения о событии.
CloudEvent1 Объект события. Используется, когда сетка событий настроена для доставки с помощью схемы CloudEvents.
EventGridEvent1 Объект события. Используется, когда сетка событий настроена для доставки с помощью схемы сетки событий.

Если требуется, чтобы функция обрабатывала пакет событий, триггер сетки событий может привязаться к следующим типам:

Тип Описание
CloudEvent[]1,
EventGridEvent[]1,
string[],
BinaryData[]1
Массив событий из пакета. Каждая запись представляет одно событие.

1 Для использования этих типов необходимо ссылаться на Microsoft.Azure.Functions.Worker.Extensions.EventGrid 3.3.0 или более поздней версии и общие зависимости для привязок типов SDK.

Экземпляр Сетки событий доступен через параметр, связанный с атрибутом EventGridTrigger, который имеет тип EventSchema.

Экземпляр Сетки событий доступен через параметр, который настраивается в свойстве name файла function.json.

Экземпляр Сетки событий доступен через параметр, который настраивается в свойстве name с типом func.EventGridEvent в файле function.json.

Схема событий

Данные для события службы "Сетка событий" получаются в качестве объекта JSON в теле HTTP-запроса. JSON должен быть аналогичным приведенному ниже:

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

Показанный пример является массивом из одного элемента. Сетка событий всегда отправляет массив, который может содержать более одного события. Среда выполнения вызывает функцию один раз для каждого элемента массива.

Свойства верхнего уровня в данных JSON события одинаковы для всех типов событий, тогда как содержимое свойства data определено для каждого типа события. Пример показан для события хранилища BLOB-объектов.

Описания распространенных и связанных с событием свойств см. в разделе Свойства события в документации по службе "Сетка событий".

Следующие шаги