Azure Functions の Azure Event Grid トリガー

Event Grid に送信されたイベントに応答するには、関数トリガーを使用します。

セットアップと構成の詳細については、概要を参照してください。

注意

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

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

バージョン 3.x

次の例は、CloudEvent にバインドする Functions 3.x の C# 関数を示したものです。

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 3.x の C# 関数を示したものです。

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

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

C# (2.x 以降)

次の例は、EventGridEvent にバインドする C# 関数を示したものです。

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Azure.EventGrid.Models;
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());
        }
    }
}

詳しくは、「パッケージ」、「属性」、「構成」、および「使用法」をご覧ください。

バージョン 1.x

次の例は、JObject にバインドする Functions 1.x の C# 関数を示したものです。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Azure.WebJobs.Host;
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));
        }
    }
}

属性と注釈

C# クラス ライブラリでは、EventGridTrigger 属性を使用します。

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

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

完全な例については、「C# の例」を参照してください。

構成

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

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

使用法

Azure Functions 1.x では、Event Grid トリガーに次のパラメーター型を使用できます。

  • JObject
  • string

Azure Functions 2.x では、Event Grid トリガーに次のパラメーター型を使用することもできます。

  • Microsoft.Azure.EventGrid.Models.EventGridEvent- すべてのイベントの種類に共通するフィールドのプロパティを定義します。

注意

Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent にバインドしようとした場合、コンパイラに "非推奨" メッセージが表示され、代わりに Microsoft.Azure.EventGrid.Models.EventGridEvent を使用するように推奨されます。 新しい種類を使用するには、Microsoft.Azure.EventGrid NuGet パッケージを参照し、EventGridEvent の種類名の先頭に Microsoft.Azure.EventGrid.Models を付けることによって完全修飾します。

その他の型

3.0.0 以降のバージョンの Event Grid 拡張機能を使用するアプリでは、Azure.Messaging.EventGrid 名前空間の EventGridEvent 型を使用します。 また、Azure. Messaging 名前空間の CloudEvent 型にバインドすることもできます。

イベント スキーマ

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 のドキュメントの「イベントのプロパティ」をご覧ください。

EventGridEvent 型では、最上位レベルのプロパティのみが定義されています。Data プロパティは JObject です。

サブスクリプションの作成

Event Grid の HTTP 要求の受信を始めるには、関数を呼び出すエンドポイント URL を指定する Event Grid サブスクリプションを作成します。

Azure portal

イベント グリッド トリガーを使用して Azure portal で開発する関数の場合は、 [統合] を選択します。次に、 [イベント グリッド トリガー] を選択し、 [Event Grid サブスクリプションの作成] を選択します。

ポータルで新しいイベント サブスクリプションをトリガーに接続する。

このリンクを選ぶと、現在のトリガー エンドポイントが既に定義された [イベント サブスクリプションの作成] ページがポータルに表示されます。

関数のエンドポイントが既に定義された [イベント サブスクリプションの作成]

Azure Portal を使ってサブスクリプションを作成する方法について詳しくは、Event Grid のドキュメントの「カスタム イベントの作成 - Azure Portal」をご覧ください。

Azure CLI

Azure CLI を使ってサブスクリプションを作成するには、az eventgrid event-subscription create コマンドを使います。

このコマンドには、関数を呼び出すエンドポイント URL が必要です。 バージョン固有の URL パターンの例を次に示します。

バージョン 2.x (以降) のランタイム

https://{functionappname}.azurewebsites.net/runtime/webhooks/eventgrid?functionName={functionname}&code={systemkey}

バージョン 1.x ランタイム

https://{functionappname}.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName={functionname}&code={systemkey}

システム キーは、Event Grid トリガー用のエンドポイント URL に含める必要のある承認キーです。 次のセクションでは、システム キーを取得する方法について説明します。

BLOB ストレージ アカウントをサブスクライブする例を次に示します (システム キーのプレースホルダーを含みます)。

バージョン 2.x (以降) のランタイム

az eventgrid resource event-subscription create -g myResourceGroup \
    --provider-namespace Microsoft.Storage --resource-type storageAccounts \
    --resource-name myblobstorage12345 --name myFuncSub \
    --included-event-types Microsoft.Storage.BlobCreated \
    --subject-begins-with /blobServices/default/containers/images/blobs/ \
    --endpoint https://mystoragetriggeredfunction.azurewebsites.net/runtime/webhooks/eventgrid?functionName=imageresizefunc&code=<key>

バージョン 1.x ランタイム

az eventgrid resource event-subscription create -g myResourceGroup \
    --provider-namespace Microsoft.Storage --resource-type storageAccounts \
    --resource-name myblobstorage12345 --name myFuncSub \
    --included-event-types Microsoft.Storage.BlobCreated \
    --subject-begins-with /blobServices/default/containers/images/blobs/ \
    --endpoint https://mystoragetriggeredfunction.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName=imageresizefunc&code=<key>

サブスクリプションを作成する方法について詳しくは、BLOB ストレージのクイック スタートまたは他の Event Grid クイック スタートのページをご覧ください。

システム キーを取得する

次の API (HTTP GET) を使って、システム キーを取得できます。

バージョン 2.x (以降) のランタイム

http://{functionappname}.azurewebsites.net/admin/host/systemkeys/eventgrid_extension?code={masterkey}

バージョン 1.x ランタイム

http://{functionappname}.azurewebsites.net/admin/host/systemkeys/eventgridextensionconfig_extension?code={masterkey}

これは管理 API なので、お使いの関数アプリのマスター キーが必要です。 システム キー (Event Grid トリガー関数を呼び出す場合) とマスター キー (関数アプリで管理タスクを実行する場合) を混同しないでください。 Event Grid トピックをサブスクライブするときは、システム キーを使います。

システム キーを提供する応答の例を次に示します。

{
  "name": "eventgridextensionconfig_extension",
  "value": "{the system key for the function}",
  "links": [
    {
      "rel": "self",
      "href": "{the URL for the function, without the system key}"
    }
  ]
}

ポータルの [Function App の設定] タブから関数アプリのマスター キーを取得できます。

重要

マスター キーでは、関数アプリへの管理者アクセス権が提供されます。 このキーを第三者と共有したり、ネイティブ クライアント アプリケーションで配布したりしないでください。

詳しくは、HTTP トリガーのリファレンス記事の「承認キー」をご覧ください。

代わりに、HTTP PUT を送信して自分でキーの値を指定することもできます。

ビューアー Web アプリでのローカル テスト

Event Grid トリガーをローカルにテストするには、クラウド内の送信元からローカル コンピューターに配信された Event Grid の HTTP 要求を取得する必要があります。 これを行う方法の 1 つは、オンラインで要求をキャプチャし、ローカル コンピューター上でそれを手動で再送信することです。

  1. イベント メッセージをキャプチャするビューアー Web アプリを作成します。
  2. ビューアー アプリにイベントを送信する Event Grid サブスクリプションを作成します。
  3. 要求を生成し、ビューアー アプリから要求本文をコピーします。
  4. Event Grid トリガー関数の localhost URL に要求を手動で投稿します。

テストが完了したら、エンドポイントを更新することで、同じサブスクリプションを運用環境に使うことができます。 az eventgrid event-subscription update Azure CLI コマンドを使います。

ビューアー Web アプリを作成する

イベント メッセージのキャプチャを簡素化するために、イベント メッセージを表示する構築済みの Web アプリをデプロイすることができます。 デプロイされたソリューションには、App Service プラン、App Service Web アプリ、および GitHub からのソース コードが含まれています。

[Deploy to Azure](Azure にデプロイ) を選択して、ソリューションをサブスクリプションにデプロイします。 Azure portal で、パラメーターの値を指定します。

Button to Deploy to Azure.

デプロイが完了するまでに数分かかる場合があります。 デプロイが成功した後で、Web アプリを表示して、実行されていることを確認します。 Web ブラウザーで https://<your-site-name>.azurewebsites.net にアクセスします

サイトは表示されますが、イベントはまだ送信されていません。

新しいサイトを表示する

Event Grid のサブスクリプションを作成する

テストする種類の Event Grid サブスクリプションを作成し、イベント通知のエンドポイントとして Web アプリからの URL を指定します。 Web アプリのエンドポイントには、サフィックス /api/updates/ が含まれている必要があります。 したがって、完全な URL は https://<your-site-name>.azurewebsites.net/api/updates となります。

Azure Portal を使ってサブスクリプションを作成する方法については、Event Grid のドキュメントの「カスタム イベントの作成 - Azure Portal」を参照してください。

要求を生成する

Web アプリ エンドポイントへの HTTP トラフィックを生成するイベントをトリガーします。 たとえば、BLOB ストレージ サブスクリプションを作成した場合は、BLOB をアップロードまたは削除します。 要求が Web アプリに表示されたら、要求本文をコピーします。

最初に、サブスクリプション検証要求を受信します。検証要求はすべて無視し、イベント要求をコピーします。

Web アプリから要求本文をコピーする

要求を手動で投稿する

Event Grid 関数をローカルで実行します。 Content-Type および aeg-event-type のヘッダーは手動で設定する必要がありますが、他のすべての値は既定値のままにすることができます。

Postmancurl などのツールを使って、HTTP POST 要求を作成します。

  • Content-Type: application/json ヘッダーを設定します。
  • aeg-event-type: Notification ヘッダーを設定します。
  • 要求本文に RequestBin のデータを貼り付けます。
  • Event Grid トリガー関数の URL に投稿します。
    • 2.x 以降の場合は、次のパターンを使用します。

      http://localhost:7071/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}
      
    • 1.x の場合は、以下を使用します。

      http://localhost:7071/admin/extensions/EventGridExtensionConfig?functionName={FUNCTION_NAME}
      

functionName パラメーターには、FunctionName 属性で指定されている名前を指定する必要があります。

次のスクリーンショットでは、Postman のヘッダーと要求本文を示します。

Postman でのヘッダー

Postman での要求本文

Event Grid トリガー関数が実行されて、次の例のようなログが表示されます。

Event Grid トリガー関数のログの例

次のステップ