Azure Functions の Azure Event Grid トリガー

関数トリガーを使用して、Event Grid ソースによって送信されたイベントに応答します。 イベントを受信するには、ソースへのイベント サブスクリプションが必要です。 イベント サブスクリプションを作成する方法については、サブスクリプションの 作成に関するセクションを参照してください。 バインドの設定と構成の詳細については、概要に関するページを参照してください。

Note

Event Grid トリガーは、内部ロード バランサーの App Service Environment (ASE) ではネイティブにサポートされません。 このトリガーで使用される HTTP 要求は、仮想ネットワークへのゲートウェイなしでは関数アプリに届きません。

重要

この記事では、タブを使用して、Node.js プログラミング モデルの複数のバージョンに対応しています。 v4 モデルは一般提供されており、JavaScript と TypeScript の開発者にとって、より柔軟で直感的なエクスペリエンスが得られるように設計されています。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

Azure Functions では、Python の 2 つのプログラミング モデルがサポートされています。 バインドを定義する方法は、選択したプログラミング モデルによって異なります。

Python v2 プログラミング モデルでは、Python 関数コードでデコレーターを使用してバインドを直接定義できます。 詳細については、「Python 開発者ガイド」を参照してください。

この記事は、両方のプログラミング モデルをサポートしています。

HTTP トリガーの例については、「HTTP エンドポイントへのイベントの受信」を参照してください。

Event Grid トリガーで使われる入力パラメーターの型は、次の 3 つの要因で変わります。

  • Functions ランタイムのバージョン
  • バインド拡張機能のバージョン
  • C# 関数のモダリティ。

A C# 関数は、次の C# モードのいずれかを使用して作成できます。

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、LTS および 非 LTS バージョンの .NET および .NET Framework で実行されている C# 関数をサポートするために必要です。 分離ワーカー プロセス関数の拡張機能では、Microsoft.Azure.Functions.Worker.Extensions.* 名前空間が使用されます。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。 このモデルの一部では、主に C# ポータルの編集のためにサポートされている C# スクリプトを使用して Functions を実行できます。 インプロセス関数の拡張機能では、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; }
}

次の例は、トリガーと Event Grid 出力バインディングの両方でカスタム型がどのように使用されるかを示しています。

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 として受け取り、2 番目の例では POJO として受け取ります。

Event Grid グリッド トリガー、文字列パラメーター

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

Event Grid グリッド トリガー、POJO パラメーター

この例では、次の POJO が使用されています。Event Grid イベントの最上位プロパティを表します。

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 関数ランタイム ライブラリで、その値が Event Grid に由来するパラメーター上で EventGridTrigger 注釈を使用します。 これらの注釈を使用したパラメーターによって、イベントを受信したときに関数が実行されます。 この注釈は、Java のネイティブ型、POJO、または Optional<T> を使用した null 許容値で使用できます。

次の例は、イベント グリッド トリガーの 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 ファイルで Event Grid トリガー バインドを構成する方法を示しています。

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

Event Grid イベントは、次の PowerShell の例に示すように、eventGridEvent という名前のパラメーターを使用して関数で使用できるようになります。

param($eventGridEvent, $TriggerMetadata)

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

次の例は、Event Grid トリガー バインドと、そのバインドが使用される Python 関数を示しています。 この例は、v1 と v2 のどちらの Python プログラミング モデルを使用するかによって異なります。

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# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

メソッド シグネチャでの EventGridTrigger 属性を次に示します。

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

注釈

EventGridTrigger 注釈を使用すると、構成値を指定して、Event Grid のバインディングを宣言によって構成できます。 詳細については、構成に関するセクションを参照してください。

構成

app.eventGrid() メソッドに渡される options オブジェクトは、現在、モデル v4 のどのプロパティもサポートしていません。

構成

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。 EventGridTrigger 属性で設定するコンストラクター パラメーターまたはプロパティはありません。

function.json のプロパティ 説明
type 必須 - eventGridTrigger に設定する必要があります。
direction 必須 - in に設定する必要があります。
name 必須 - イベント データを受信するパラメーターの、関数コードで使われている変数名。

完全な例については、セクションの例を参照してください。

使用方法

Event Grid トリガーは Webhook HTTP 要求を使用します。これは、HTTP トリガーと同じ host.json 設定を使用して構成できます。

Event Grid トリガーによってサポートされるパラメーター型は、Functions ランタイムのバージョン、拡張機能パッケージのバージョン、および使用される C# のモダリティによって異なります。

関数で 1 つのイベントを処理するとき、Event Grid トリガーは次の種類にバインドできます。

Type 説明
JSON シリアル化可能な型 Functions はイベントの JSON データを Plain Old CLR Object (POCO) 型に逆シリアル化しようとします。
string 文字列としてのイベント。
BinaryData1 イベント メッセージのバイト数。
CloudEvent1 イベント オブジェクト。 CloudEvents スキーマを使用して配信するように Event Grid が構成されているときに使用します。
EventGridEvent1 イベント オブジェクト。 Event Grid スキーマを使用して配信するように Event Grid が構成されているときに使用します。

関数でイベントのバッチを処理するとき、Event Grid トリガーは次の種類にバインドできます。

Type 説明
CloudEvent[]1
EventGridEvent[]1
string[]=
BinaryData[]1
バッチのイベントの配列。 各エントリは 1 つのイベントを表します。

1 これらの型を使用するには、Microsoft.Azure.Functions.Worker.Extensions.EventGrid 3.3.0 以降SDK 型バインドの一般的な依存関係に関する記事を参照する必要があります。

Event Grid インスタンスは、EventGridTrigger 属性に関連付けられたパラメーターを介して、EventSchema と型指定して使用できます。

Event Grid インスタンスは、function.json ファイルの name プロパティで構成されたパラメーターを介して使用できます。

Event Grid インスタンスは、function.json ファイルの name プロパティで構成されたパラメーターを介して、func.EventGridEvent と型指定して使用できます。

イベント スキーマ

Event Grid イベントのデータは、HTTP 要求の本文内の JSON オブジェクトとして受信されます。 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"
}]

示されている例は、1 要素の配列です。 Event Grid は常に配列を送信し、配列で複数のイベントを送信できます。 ランタイムは、配列の各要素に対して 1 回、関数を呼び出します。

イベント JSON データの最上位レベルのプロパティはすべてのイベントの種類で同じですが、data プロパティの内容は各イベントの種類に固有です。 この例では、BLOB ストレージ イベントのものです。

共通プロパティとイベント固有プロパティについて詳しくは、Event Grid のドキュメントの「イベントのプロパティ」をご覧ください。

次のステップ