Azure Functions の Azure Event Grid トリガー

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

Note

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

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

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

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

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

  •     インプロセス クラス ライブラリ: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。
  • 分離ワーカー プロセス クラス ライブラリ: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、非 LTS バージョンの .NET および.NET Framework で実行されている C# 関数をサポートするために必要です。
  • C# スクリプト: Azure portal で c# 関数を作成するときに主に使用されます。

次の例は、CloudEvent バインド パラメーターを使う Functions バージョン 4.x 関数を示しています。

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

次の例は、EventGridEvent バインド パラメーターを使う Functions バージョン 4.x 関数を示しています。

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

namespace Company.Function
{
    public static class EventGridTriggerDemo
    {
        [FunctionName("EventGridTriggerDemo")]
        public static void Run([EventGridTrigger] EventGridEvent eventGridEvent, ILogger log)
        {
            log.LogInformation(eventGridEvent.Data.ToString());
        }
    }
}

次の例は、JObject バインド パラメーターを使う関数を示しています。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public static class EventGridTriggerCSharp
    {
        [FunctionName("EventGridTriggerCSharp")]
        public static void Run([EventGridTrigger] JObject eventGridEvent, ILogger log)
        {
            log.LogInformation(eventGridEvent.ToString(Formatting.Indented));
        }
    }
}

このセクションには、次の例が含まれています。

次の例は、バインドを使用してイベントを生成する 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 許容値で使用できます。

次の例は、function.json ファイルのトリガー バインドと、そのバインドを使用する JavaScript 関数を示しています。

function.json ファイルのバインディング データを次に示します。

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

JavaScript コードを次に示します。

module.exports = async function (context, eventGridEvent) {
    context.log("JavaScript Event Grid function processed a request.");
    context.log("Subject: " + eventGridEvent.subject);
    context.log("Time: " + eventGridEvent.eventTime);
    context.log("Data: " + JSON.stringify(eventGridEvent.data));
};

次の例は、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

次の例は、function.json ファイルのトリガー バインドと、そのバインドが使用される Python 関数を示しています。

function.json ファイルのバインディング データを次に示します。

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "event",
      "direction": "in"
    }
  ],
  "disabled": false,
  "scriptFile": "__init__.py"
}

Python コードを次に示します。

import json
import logging

import azure.functions as func

def main(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 構成ファイルを使用します。

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

[FunctionName("EventGridTest")]
public static void EventGridTest([EventGridTrigger] JObject eventGridEvent, ILogger log)
{

注釈

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

構成

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

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

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

使用方法

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

インプロセス C# クラス ライブラリ関数では、次の型がサポートされています。

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

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

Event Grid インスタンスは、function.json ファイルの プロパティで構成されたパラメーターを介して、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 のドキュメントの「イベントのプロパティ」をご覧ください。

次のステップ