Azure Functions の Event Grid トリガーEvent Grid trigger for Azure Functions

この記事では、Azure Functions で Event Grid イベントを処理する方法を説明します。This article explains how to handle Event Grid events in Azure Functions.

Event Grid は、"パブリッシャー" 内で発生したイベントについてユーザーに通知する HTTP 要求を送信する Azure サービスです。Event Grid is an Azure service that sends HTTP requests to notify you about events that happen in publishers. パブリッシャーは、イベントを生成するサービスまたはリソースです。A publisher is the service or resource that originates the event. たとえば、Azure Blob Storage アカウントはパブリッシャーであり、BLOB のアップロードまたは削除がイベントです。For example, an Azure blob storage account is a publisher, and a blob upload or deletion is an event. 一部の Azure サービスには、Event Grid にイベントを発行するサポートが組み込まれていますSome Azure services have built-in support for publishing events to Event Grid.

イベント "ハンドラー" は、イベントを受信して処理します。Event handlers receive and process events. Azure Functions は、Event Grid イベントを処理する組み込みサポートを備えている Azure サービスの 1 つです。Azure Functions is one of several Azure services that have built-in support for handling Event Grid events. この記事では、Event Grid からイベントを受信したときに、Event Grid トリガーを使って関数を呼び出す方法を説明します。In this article, you learn how to use an Event Grid trigger to invoke a function when an event is received from Event Grid.

好みに応じて、Event Grid イベントの処理に HTTP トリガーを使うこともできます。後の「Event Grid トリガーとして HTTP トリガーを使用する」をご覧ください。If you prefer, you can use an HTTP trigger to handle Event Grid Events; see Use an HTTP trigger as an Event Grid trigger later in this article. 現時点では、CloudEvents スキーマでイベントを配信する際に、Azure Functions アプリの Event Grid トリガーを使用することはできません。Currently, you can't use an Event Grid trigger for an Azure Functions app when the event is delivered in the CloudEvents schema. 代わりに、HTTP トリガーを使用してください。Instead, use an HTTP trigger.

これは、Azure Functions の開発者向けリファレンス情報です。This is reference information for Azure Functions developers. Azure Functions を初めて使用する場合は、先に次のリソースを参照してください。If you're new to Azure Functions, start with the following resources:

パッケージ - Functions 2.xPackages - Functions 2.x

Event Grid トリガーは、Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet パッケージ、バージョン 2.x で提供されます。The Event Grid trigger is provided in the Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet package, version 2.x. パッケージのソース コードは、azure-functions-eventgrid-extension GitHub リポジトリにあります。Source code for the package is in the azure-functions-eventgrid-extension GitHub repository.

次の表に、各開発環境でこのバインディングのサポートを追加する方法を示します。The following table tells how to add support for this binding in each development environment.

開発環境Development environment サポートを追加するバージョン:To add support in
Functions 2.xFunctions 2.x
ローカル開発 - C# クラス ライブラリLocal development - C# class library パッケージをインストールするInstall the package
ローカル開発で - C# スクリプト、JavaScript、F#、Java、PythonLocal development - C# script, JavaScript, F#, Java and Python 拡張機能を登録するRegister the extension
Portal 開発Portal development 出力バインドの追加時にインストールするInstall when adding output binding

関数アプリ プロジェクトを再発行せずにポータルで既存のバインディング拡張機能を更新する方法については、拡張機能の更新に関するページを参照してください。To learn how to update existing binding extensions in the portal without having to republish your function app project, see Update your extensions.

パッケージ - Functions 1.xPackages - Functions 1.x

Event Grid トリガーは、Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet パッケージ、バージョン 1.x で提供されます。The Event Grid trigger is provided in the Microsoft.Azure.WebJobs.Extensions.EventGrid NuGet package, version 1.x. パッケージのソース コードは、azure-functions-eventgrid-extension GitHub リポジトリにあります。Source code for the package is in the azure-functions-eventgrid-extension GitHub repository.

次の表に、各開発環境でこのバインディングのサポートを追加する方法を示します。The following table tells how to add support for this binding in each development environment.

開発環境Development environment サポートを追加するバージョン:To add support in
Functions 1.xFunctions 1.x
ローカル開発 - C# クラス ライブラリLocal development - C# class library パッケージをインストールするInstall the package
ローカル開発で - C# スクリプト、JavaScript、F#Local development - C# script, JavaScript, F# 自動Automatic
Portal 開発Portal development 自動Automatic

Example

Event Grid トリガーの言語固有の例をご覧ください。See the language-specific example for an Event Grid trigger:

HTTP トリガーの例については、後の「HTTP トリガーを使用する方法」をご覧ください。For an HTTP trigger example, see How to use HTTP trigger later in this article.

C# (2.x)C# (2.x)

次の例は、EventGridEvent にバインドする Functions 2.x の C# 関数を示したものです。The following example shows a Functions 2.x C# function that binds to EventGridEvent:

using Microsoft.Azure.EventGrid.Models;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

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

詳しくは、「パッケージ」、「属性」、「構成」、および「使用法」をご覧ください。For more information, see Packages, Attributes, Configuration, and Usage.

C# (バージョン 1.x)C# (Version 1.x)

次の例は、JObject にバインドする Functions 1.x の C# 関数を示したものです。The following example shows a Functions 1.x C# function that binds to JObject:

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# スクリプトの例C# script example

次の例は、function.json ファイルのトリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。The following example shows a trigger binding in a function.json file and a C# script function that uses the binding.

function.json ファイルのバインディング データを次に示します。Here's the binding data in the function.json file:

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

C# スクリプト (バージョン 2.x)C# script (Version 2.x)

EventGridEvent にバインドする Functions 2.x の C# スクリプト コードを次に示します。Here's Functions 2.x C# script code that binds to EventGridEvent:

#r "Microsoft.Azure.EventGrid"
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(EventGridEvent eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.Data.ToString());
}

詳しくは、「パッケージ」、「属性」、「構成」、および「使用法」をご覧ください。For more information, see Packages, Attributes, Configuration, and Usage.

C# スクリプト (バージョン 1.x)C# script (Version 1.x)

JObject にバインドする Functions 1.x の C# スクリプト コードを次に示します。Here's Functions 1.x C# script code that binds to JObject:

#r "Newtonsoft.Json"

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static void Run(JObject eventGridEvent, TraceWriter log)
{
    log.Info(eventGridEvent.ToString(Formatting.Indented));
}

JavaScript の例JavaScript example

次の例は、function.json ファイルのトリガー バインドと、そのバインドを使用する JavaScript 関数を示しています。The following example shows a trigger binding in a function.json file and a JavaScript function that uses the binding.

function.json ファイルのバインディング データを次に示します。Here's the binding data in the function.json file:

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

JavaScript コードを次に示します。Here's the JavaScript code:

module.exports = 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));
    context.done();
};

Python の例Python example

次の例は、function.json ファイルのトリガー バインドと、そのバインドが使用される Python 関数を示しています。The following example shows a trigger binding in a function.json file and a Python function that uses the binding.

function.json ファイルのバインディング データを次に示します。Here's the binding data in the function.json file:

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

Python コードを次に示します。Here's the Python code:

import logging
import azure.functions as func

def main(event: func.EventGridEvent):
    logging.info("Python Event Grid function processed a request.")
    logging.info("  Subject: %s", event.subject)
    logging.info("  Time: %s", event.event_time)
    logging.info("  Data: %s", event.get_json())

トリガー - Java の例Trigger - Java examples

このセクションには、次の例が含まれています。This section contains the following examples:

次の例では、function.json ファイルのトリガー バインドとそのバインドを使用し、イベントを出力する Java 関数を示しています。最初にイベントとして String を受け取り、次に POJO を受け取ります。The following examples show trigger binding in a function.json file and Java functions that use the binding and print out an event, first receiving the event as String and second as a POJO.

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

Event Grid グリッド トリガー、文字列パラメーター (Java)Event Grid trigger, String parameter (Java)

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

Event Grid グリッド トリガー、POJO パラメーター (Java)Event Grid trigger, POJO parameter (Java)

この例では、次の POJO が使用されています。Event Grid イベントの最上位プロパティを表します。This example uses the following POJO, representing the top-level properties of an Event Grid event:

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 に逆シリアル化され、関数で使用されます。Upon arrival, the event's JSON payload is de-serialized into the EventSchema POJO for use by the function. それにより、関数はオブジェクト指向でイベントのプロパティにアクセスできます。This allows the function to access the event's properties in an object-oriented way.

  @FunctionName("eventGridMonitor")
  public void logEvent(
    @EventGridTrigger(
      name = "event"
    ) 
    EventSchema event, 
    final ExecutionContext context) {
      // log 
      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 関数ランタイム ライブラリで、その値が EventGrid に由来するパラメーター上で EventGridTrigger 注釈を使用します。In the Java functions runtime library, use the EventGridTrigger annotation on parameters whose value would come from EventGrid. これらの注釈を使用したパラメーターによって、イベントを受信したときに関数が実行されます。Parameters with these annotations cause the function to run when an event arrives. この注釈は、Java のネイティブ型、POJO、または Optional<T> を使用した null 許容値で使用できます。This annotation can be used with native Java types, POJOs, or nullable values using Optional<T>.

属性Attributes

C# クラス ライブラリでは、EventGridTrigger 属性を使用します。In C# class libraries, use the EventGridTrigger attribute.

メソッド シグネチャでの EventGridTrigger 属性を次に示します。Here's an EventGridTrigger attribute in a method signature:

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

完全な例については、「C# の例」を参照してください。For a complete example, see C# example.

構成Configuration

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。The following table explains the binding configuration properties that you set in the function.json file. EventGridTrigger 属性で設定するコンストラクター パラメーターまたはプロパティはありません。There are no constructor parameters or properties to set in the EventGridTrigger attribute.

function.json のプロパティfunction.json property 説明Description
typetype 必須 - eventGridTrigger に設定する必要があります。Required - must be set to eventGridTrigger.
directiondirection 必須 - in に設定する必要があります。Required - must be set to in.
namename 必須 - イベント データを受信するパラメーターの、関数コードで使われている変数名。Required - the variable name used in function code for the parameter that receives the event data.

使用法Usage

Azure Functions 1.x の C# および F# 関数については、Event Grid トリガーに次のパラメーター型を使用できます。For C# and F# functions in Azure Functions 1.x, you can use the following parameter types for the Event Grid trigger:

  • JObject
  • string

Azure Functions 2.x の C# および F# 関数については、Event Grid トリガーに次のパラメーター型を使用することもできます。For C# and F# functions in Azure Functions 2.x, you also have the option to use the following parameter type for the Event Grid trigger:

  • Microsoft.Azure.EventGrid.Models.EventGridEvent- すべてのイベントの種類に共通するフィールドのプロパティを定義します。Microsoft.Azure.EventGrid.Models.EventGridEvent- Defines properties for the fields common to all event types.

注意

Functions 1.x では、Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent にバインドしようとした場合、コンパイラに「非推奨」メッセージが表示され、代わりに Microsoft.Azure.EventGrid.Models.EventGridEvent 使用するよう推奨されます。In Functions v1 if you try to bind to Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent, the compiler will display a "deprecated" message and advise you to use Microsoft.Azure.EventGrid.Models.EventGridEvent instead. 新しい種類を使用するには、Microsoft.Azure.EventGrid NuGet パッケージを参照し、EventGridEvent の種類名の先頭に Microsoft.Azure.EventGrid.Models を付けることによって完全修飾します。To use the newer type, reference the Microsoft.Azure.EventGrid NuGet package and fully qualify the EventGridEvent type name by prefixing it with Microsoft.Azure.EventGrid.Models. C# スクリプト関数で NuGet パッケージを参照する方法については、「NuGet パッケージを使用する」をご覧くださいFor information about how to reference NuGet packages in a C# script function, see Using NuGet packages

JavaScript 関数では、function.json name プロパティによって指定されているパラメーターが、イベント オブジェクトへの参照を保持しています。For JavaScript functions, the parameter named by the function.json name property has a reference to the event object.

イベント スキーマEvent schema

Event Grid イベントのデータは、HTTP 要求の本文内の JSON オブジェクトとして受信されます。Data for an Event Grid event is received as a JSON object in the body of an HTTP request. JSON は次の例のようになります。The JSON looks similar to the following example:

[{
  "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 要素の配列です。The example shown is an array of one element. Event Grid は常に配列を送信し、配列で複数のイベントを送信できます。Event Grid always sends an array and may send more than one event in the array. ランタイムは、配列の各要素に対して 1 回、関数を呼び出します。The runtime invokes your function once for each array element.

イベント JSON データの最上位レベルのプロパティはすべてのイベントの種類で同じですが、data プロパティの内容は各イベントの種類に固有です。The top-level properties in the event JSON data are the same among all event types, while the contents of the data property are specific to each event type. この例では、BLOB ストレージ イベントのものです。The example shown is for a blob storage event.

共通プロパティとイベント固有プロパティについて詳しくは、Event Grid のドキュメントの「イベントのプロパティ」をご覧ください。For explanations of the common and event-specific properties, see Event properties in the Event Grid documentation.

EventGridEvent 型では、最上位レベルのプロパティのみが定義されています。Data プロパティは JObject です。The EventGridEvent type defines only the top-level properties; the Data property is a JObject.

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

Event Grid の HTTP 要求の受信を始めるには、関数を呼び出すエンドポイント URL を指定する Event Grid サブスクリプションを作成します。To start receiving Event Grid HTTP requests, create an Event Grid subscription that specifies the endpoint URL that invokes the function.

Azure ポータルAzure portal

Event Grid トリガーを使って Azure Portal で開発した関数の場合は、[vent Grid サブスクリプションの追加] を選びます。For functions that you develop in the Azure portal with the Event Grid trigger, select Add Event Grid subscription.

ポータルでサブスクリプションを作成する

このリンクを選ぶと、ポータルに [イベント サブスクリプションの作成] ページが表示され、エンドポイント URL があらかじめ設定されています。When you select this link, the portal opens the Create Event Subscription page with the endpoint URL prefilled.

事前設定されたエンドポイント URL

Azure Portal を使ってサブスクリプションを作成する方法について詳しくは、Event Grid のドキュメントの「カスタム イベントの作成 - Azure Portal」をご覧ください。For more information about how to create subscriptions by using the Azure portal, see Create custom event - Azure portal in the Event Grid documentation.

Azure CLIAzure CLI

Azure CLI を使ってサブスクリプションを作成するには、az eventgrid event-subscription create コマンドを使います。To create a subscription by using the Azure CLI, use the az eventgrid event-subscription create command.

このコマンドには、関数を呼び出すエンドポイント URL が必要です。The command requires the endpoint URL that invokes the function. バージョン固有の URL パターンの例を次に示します。The following example shows the version-specific URL pattern:

バージョン 2.x ランタイムVersion 2.x runtime

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

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

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

システム キーは、Event Grid トリガー用のエンドポイント URL に含める必要のある承認キーです。The system key is an authorization key that has to be included in the endpoint URL for an Event Grid trigger. 次のセクションでは、システム キーを取得する方法について説明します。The following section explains how to get the system key.

BLOB ストレージ アカウントをサブスクライブする例を次に示します (システム キーのプレースホルダーを含みます)。Here's an example that subscribes to a blob storage account (with a placeholder for the system key):

バージョン 2.x ランタイムVersion 2.x runtime

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 ランタイムVersion 1.x runtime

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 クイック スタートのページをご覧ください。For more information about how to create a subscription, see the blob storage quickstart or the other Event Grid quickstarts.

システム キーを取得するGet the system key

次の API (HTTP GET) を使って、システム キーを取得できます。You can get the system key by using the following API (HTTP GET):

バージョン 2.x ランタイムVersion 2.x runtime

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

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

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

これは管理 API なので、お使いの関数アプリのマスター キーが必要です。This is an admin API, so it requires your function app master key. システム キー (Event Grid トリガー関数を呼び出す場合) とマスター キー (関数アプリで管理タスクを実行する場合) を混同しないでください。Don't confuse the system key (for invoking an Event Grid trigger function) with the master key (for performing administrative tasks on the function app). Event Grid トピックをサブスクライブするときは、システム キーを使います。When you subscribe to an Event Grid topic, be sure to use the system key.

システム キーを提供する応答の例を次に示します。Here's an example of the response that provides the system key:

{
  "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 の設定] タブから関数アプリのマスター キーを取得できます。You can get the master key for your function app from the Function app settings tab in the portal.

重要

マスター キーでは、関数アプリへの管理者アクセス権が提供されます。The master key provides administrator access to your function app. このキーを第三者と共有したり、ネイティブ クライアント アプリケーションで配布したりしないでください。Don't share this key with third parties or distribute it in native client applications.

詳しくは、HTTP トリガーのリファレンス記事の「承認キー」をご覧ください。For more information, see Authorization keys in the HTTP trigger reference article.

代わりに、HTTP PUT を送信して自分でキーの値を指定することもできます。Alternatively, you can send an HTTP PUT to specify the key value yourself.

ビューアー Web アプリでのローカル テストLocal testing with viewer web app

Event Grid トリガーをローカルにテストするには、クラウド内の送信元からローカル コンピューターに配信された Event Grid の HTTP 要求を取得する必要があります。To test an Event Grid trigger locally, you have to get Event Grid HTTP requests delivered from their origin in the cloud to your local machine. これを行う方法の 1 つは、オンラインで要求をキャプチャし、ローカル コンピューター上でそれを手動で再送信することです。One way to do that is by capturing requests online and manually resending them on your local machine:

  1. イベント メッセージをキャプチャするビューアー Web アプリを作成します。Create a viewer web app that captures event messages.
  2. ビューアー アプリにイベントを送信する Event Grid サブスクリプションを作成します。Create an Event Grid subscription that sends events to the viewer app.
  3. 要求を生成し、ビューアー アプリから要求本文をコピーします。Generate a request and copy the request body from the viewer app.
  4. Event Grid トリガー関数の localhost URL に要求を手動で投稿します。Manually post the request to the localhost URL of your Event Grid trigger function.

テストが完了したら、エンドポイントを更新することで、同じサブスクリプションを運用環境に使うことができます。When you're done testing, you can use the same subscription for production by updating the endpoint. az eventgrid event-subscription update Azure CLI コマンドを使います。Use the az eventgrid event-subscription update Azure CLI command.

ビューアー Web アプリを作成するCreate a viewer web app

イベント メッセージのキャプチャを簡素化するために、イベント メッセージを表示する構築済みの Web アプリをデプロイすることができます。To simplify capturing event messages, you can deploy a pre-built web app that displays the event messages. デプロイされたソリューションには、App Service プラン、App Service Web アプリ、および GitHub からのソース コードが含まれています。The deployed solution includes an App Service plan, an App Service web app, and source code from GitHub.

[Deploy to Azure](Azure にデプロイ) を選択して、ソリューションをサブスクリプションにデプロイします。Select Deploy to Azure to deploy the solution to your subscription. Azure portal で、パラメーターの値を指定します。In the Azure portal, provide values for the parameters.

デプロイが完了するまでに数分かかる場合があります。The deployment may take a few minutes to complete. デプロイが成功した後で、Web アプリを表示して、実行されていることを確認します。After the deployment has succeeded, view your web app to make sure it's running. Web ブラウザーで https://<your-site-name>.azurewebsites.net にアクセスしますIn a web browser, navigate to: https://<your-site-name>.azurewebsites.net

サイトは表示されますが、イベントはまだ送信されていません。You see the site but no events have been posted to it yet.

新しいサイトを表示する

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

テストする種類の Event Grid サブスクリプションを作成し、イベント通知のエンドポイントとして Web アプリからの URL を指定します。Create an Event Grid subscription of the type you want to test, and give it the URL from your web app as the endpoint for event notification. Web アプリのエンドポイントには、サフィックス /api/updates/ が含まれている必要があります。The endpoint for your web app must include the suffix /api/updates/. したがって、完全な URL は https://<your-site-name>.azurewebsites.net/api/updates となります。So, the full URL is https://<your-site-name>.azurewebsites.net/api/updates

Azure Portal を使ってサブスクリプションを作成する方法については、Event Grid のドキュメントの「カスタム イベントの作成 - Azure Portal」を参照してください。For information about how to create subscriptions by using the Azure portal, see Create custom event - Azure portal in the Event Grid documentation.

要求を生成するGenerate a request

Web アプリ エンドポイントへの HTTP トラフィックを生成するイベントをトリガーします。Trigger an event that will generate HTTP traffic to your web app endpoint. たとえば、BLOB ストレージ サブスクリプションを作成した場合は、BLOB をアップロードまたは削除します。For example, if you created a blob storage subscription, upload or delete a blob. 要求が Web アプリに表示されたら、要求本文をコピーします。When a request shows up in your web app, copy the request body.

最初に、サブスクリプション検証要求を受信します。検証要求はすべて無視し、イベント要求をコピーします。The subscription validation request will be received first; ignore any validation requests, and copy the event request.

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

要求を手動で投稿するManually post the request

Event Grid 関数をローカルで実行します。Run your Event Grid function locally.

Postmancurl などのツールを使って、HTTP POST 要求を作成します。Use a tool such as Postman or curl to create an HTTP POST request:

  • Content-Type: application/json ヘッダーを設定します。Set a Content-Type: application/json header.
  • aeg-event-type: Notification ヘッダーを設定します。Set an aeg-event-type: Notification header.
  • 要求本文に RequestBin のデータを貼り付けます。Paste the RequestBin data into the request body.
  • Event Grid トリガー関数の URL に投稿します。Post to the URL of your Event Grid trigger function.
    • 2.x の場合は、以下のパターンを使用します。For 2.x use the following pattern:

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

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

functionName パラメーターには、FunctionName 属性で指定されている名前を指定する必要があります。The functionName parameter must be the name specified in the FunctionName attribute.

次のスクリーンショットでは、Postman のヘッダーと要求本文を示します。The following screenshots show the headers and request body in Postman:

Postman でのヘッダー

Postman での要求本文

Event Grid トリガー関数が実行されて、次の例のようなログが表示されます。The Event Grid trigger function executes and shows logs similar to the following example:

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

ngrok でのローカル テストLocal testing with ngrok

Event Grid トリガーをローカルにテストするもう 1 つの方法は、インターネットと開発用コンピューターの間の HTTP 接続を自動化することです。Another way to test an Event Grid trigger locally is to automate the HTTP connection between the Internet and your development computer. これは、ngrok という名前のオープン ソース ツールを使って行うことができます。You can do that with an open-source tool named ngrok:

  1. ngrok のエンドポイントを作成します。Create an ngrok endpoint.
  2. Event Grid トリガー関数を実行します。Run the Event Grid trigger function.
  3. ngrok のエンドポイントにイベントを送信する Event Grid サブスクリプションを作成します。Create an Event Grid subscription that sends events to the ngrok endpoint.
  4. イベントをトリガーします。Trigger an event.

テストが完了したら、エンドポイントを更新することで、同じサブスクリプションを運用環境に使うことができます。When you're done testing, you can use the same subscription for production by updating the endpoint. az eventgrid event-subscription update Azure CLI コマンドを使います。Use the az eventgrid event-subscription update Azure CLI command.

ngrok のエンドポイントを作成するCreate an ngrok endpoint

ngrok から ngrok.exe をダウンロードし、次のコマンドで実行します。Download ngrok.exe from ngrok, and run with the following command:

ngrok http -host-header=localhost 7071

-host-header パラメーターは、関数ランタイムは localhost で実行するときは localhost からの要求を期待するので必要です。The -host-header parameter is needed because the functions runtime expects requests from localhost when it runs on localhost. 7071 は、ランタイムがローカルで実行するときの既定のポート番号です。7071 is the default port number when the runtime runs locally.

コマンドは、次のような出力を作成します。The command creates output like the following:

Session Status                online
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://263db807.ngrok.io -> localhost:7071
Forwarding                    https://263db807.ngrok.io -> localhost:7071

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

Event Grid サブスクリプションには、https://{subdomain}.ngrok.io という URL を使います。You'll use the https://{subdomain}.ngrok.io URL for your Event Grid subscription.

Event Grid トリガー関数を実行するRun the Event Grid trigger function

ngrok の URL は Event Grid によって特別に処理されないので、サブスクリプションが作成される時点で、関数がローカルで実行している必要があります。The ngrok URL doesn't get special handling by Event Grid, so your function must be running locally when the subscription is created. 実行していないと、検証応答が送信されず、サブスクリプションの作成が失敗します。If it isn't, the validation response doesn't get sent and the subscription creation fails.

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

テストする種類の Event Grid サブスクリプションを作成し、それに ngrok エンドポイントを提供します。Create an Event Grid subscription of the type you want to test, and give it your ngrok endpoint.

Functions 2.x に対して、次のようにこのエンドポイント パターンを使用します。Use this endpoint pattern for Functions 2.x:

https://{SUBDOMAIN}.ngrok.io/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}

Functions 1.x に対して、次のようにこのエンドポイント パターンを使用します。Use this endpoint pattern for Functions 1.x:

https://{SUBDOMAIN}.ngrok.io/admin/extensions/EventGridExtensionConfig?functionName={FUNCTION_NAME}

{FUNCTION_NAME} パラメーターには、FunctionName 属性で指定されている名前を指定する必要があります。The {FUNCTION_NAME} parameter must be the name specified in the FunctionName attribute.

Azure CLI を使う例を次に示します。Here's an example using the Azure CLI:

az eventgrid event-subscription create --resource-id /subscriptions/aeb4b7cb-b7cb-b7cb-b7cb-b7cbb6607f30/resourceGroups/eg0122/providers/Microsoft.Storage/storageAccounts/egblobstor0122 --name egblobsub0126 --endpoint https://263db807.ngrok.io/runtime/webhooks/eventgrid?functionName=EventGridTrigger

サブスクリプションを作成する方法については、前の「サブスクリプションの作成」をご覧ください。For information about how to create a subscription, see Create a subscription earlier in this article.

イベントをトリガーするTrigger an event

ngrok のエンドポイントへの HTTP トラフィックを生成するイベントをトリガーします。Trigger an event that will generate HTTP traffic to your ngrok endpoint. たとえば、BLOB ストレージ サブスクリプションを作成した場合は、BLOB をアップロードまたは削除します。For example, if you created a blob storage subscription, upload or delete a blob.

Event Grid トリガー関数が実行されて、次の例のようなログが表示されます。The Event Grid trigger function executes and shows logs similar to the following example:

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

Event Grid トリガーとして HTTP トリガーを使用するUse an HTTP trigger as an Event Grid trigger

Event Grid イベントは HTTP 要求として受信されるので、Event Grid トリガーの代わりに HTTP トリガーを使ってイベントを処理できます。Event Grid events are received as HTTP requests, so you can handle events by using an HTTP trigger instead of an Event Grid trigger. これを行う理由の 1 つとして考えられるのは、関数を呼び出すエンドポイントの URL をより詳細に制御するためです。One possible reason for doing that is to get more control over the endpoint URL that invokes the function. もう 1 つの理由は、CloudEvents スキーマでイベントを受信する必要があるためです。Another reason is when you need to receive events in the CloudEvents schema. 現時点では、Event Grid トリガーでは CloudEvents スキーマはサポートされていません。Currently, the Event Grid trigger doesn't support the CloudEvents schema. このセクションの例では、Event Grid スキーマと CloudEvents スキーマの両方のソリューションを示します。The examples in this section show solutions for both Event Grid schema and CloudEvents schema.

HTTP トリガーを使う場合は、Event Grid トリガーによって自動的に行われる処理のコードを記述する必要があります。If you use an HTTP trigger, you have to write code for what the Event Grid trigger does automatically:

関数をローカルに呼び出す場合、または Azure 内で実行するときに使う URL については、HTTP トリガーのバインドに関するリファレンス ドキュメントをご覧くださいFor information about the URL to use for invoking the function locally or when it runs in Azure, see the HTTP trigger binding reference documentation

Event Grid スキーマEvent Grid schema

次に示す HTTP トリガーの C# コード サンプルでは、Event Grid トリガーの動作をシミュレートします。The following sample C# code for an HTTP trigger simulates Event Grid trigger behavior. Event Grid スキーマで配信されたイベントでは、この例を使用します。Use this example for events delivered in the Event Grid schema.

[FunctionName("HttpTrigger")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequestMessage req,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    var messages = await req.Content.ReadAsAsync<JArray>();

    // If the request is for subscription validation, send back the validation code.
    if (messages.Count > 0 && string.Equals((string)messages[0]["eventType"],
        "Microsoft.EventGrid.SubscriptionValidationEvent",
        System.StringComparison.OrdinalIgnoreCase))
    {
        log.LogInformation("Validate request received");
        return req.CreateResponse<object>(new
        {
            validationResponse = messages[0]["data"]["validationCode"]
        });
    }

    // The request is not for subscription validation, so it's for one or more events.
    foreach (JObject message in messages)
    {
        // Handle one event.
        EventGridEvent eventGridEvent = message.ToObject<EventGridEvent>();
        log.LogInformation($"Subject: {eventGridEvent.Subject}");
        log.LogInformation($"Time: {eventGridEvent.EventTime}");
        log.LogInformation($"Event data: {eventGridEvent.Data.ToString()}");
    }

    return req.CreateResponse(HttpStatusCode.OK);
}

次に示す HTTP トリガーの JavaScript コード サンプルでは、Event Grid トリガーの動作をシミュレートします。The following sample JavaScript code for an HTTP trigger simulates Event Grid trigger behavior. Event Grid スキーマで配信されたイベントでは、この例を使用します。Use this example for events delivered in the Event Grid schema.

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var messages = req.body;
    // If the request is for subscription validation, send back the validation code.
    if (messages.length > 0 && messages[0].eventType == "Microsoft.EventGrid.SubscriptionValidationEvent") {
        context.log('Validate request received');
        var code = messages[0].data.validationCode;
        context.res = { status: 200, body: { "ValidationResponse": code } };
    }
    else {
        // The request is not for subscription validation, so it's for one or more events.
        // Event Grid schema delivers events in an array.
        for (var i = 0; i < messages.length; i++) {
            // Handle one event.
            var message = messages[i];
            context.log('Subject: ' + message.subject);
            context.log('Time: ' + message.eventTime);
            context.log('Data: ' + JSON.stringify(message.data));
        }
    }
    context.done();
};

イベント処理コードは、messages 配列のループ内を処理します。Your event-handling code goes inside the loop through the messages array.

CloudEvents スキーマCloudEvents schema

次に示す HTTP トリガーの C# コード サンプルでは、Event Grid トリガーの動作をシミュレートします。The following sample C# code for an HTTP trigger simulates Event Grid trigger behavior. CloudEvents スキーマで配信されたイベントでは、この例を使用します。Use this example for events delivered in the CloudEvents schema.

[FunctionName("HttpTrigger")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    var requestmessage = await req.Content.ReadAsStringAsync();
    var message = JToken.Parse(requestmessage);

    if (message.Type == JTokenType.Array)
    {
        // If the request is for subscription validation, send back the validation code.
        if (string.Equals((string)message[0]["eventType"],
        "Microsoft.EventGrid.SubscriptionValidationEvent",
        System.StringComparison.OrdinalIgnoreCase))
        {
            log.LogInformation("Validate request received");
            return req.CreateResponse<object>(new
            {
                validationResponse = message[0]["data"]["validationCode"]
            });
        }
    }
    else
    {
        // The request is not for subscription validation, so it's for an event.
        // CloudEvents schema delivers one event at a time.
        log.LogInformation($"Source: {message["source"]}");
        log.LogInformation($"Time: {message["eventTime"]}");
        log.LogInformation($"Event data: {message["data"].ToString()}");
    }

    return req.CreateResponse(HttpStatusCode.OK);
}

次に示す HTTP トリガーの JavaScript コード サンプルでは、Event Grid トリガーの動作をシミュレートします。The following sample JavaScript code for an HTTP trigger simulates Event Grid trigger behavior. CloudEvents スキーマで配信されたイベントでは、この例を使用します。Use this example for events delivered in the CloudEvents schema.

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var message = req.body;
    // If the request is for subscription validation, send back the validation code.
    if (message.length > 0 && message[0].eventType == "Microsoft.EventGrid.SubscriptionValidationEvent") {
        context.log('Validate request received');
        var code = message[0].data.validationCode;
        context.res = { status: 200, body: { "ValidationResponse": code } };
    }
    else {
        // The request is not for subscription validation, so it's for an event.
        // CloudEvents schema delivers one event at a time.
        var event = JSON.parse(message);
        context.log('Source: ' + event.source);
        context.log('Time: ' + event.eventTime);
        context.log('Data: ' + JSON.stringify(event.data));
    }
    context.done();
};

次の手順Next steps