Azure Event Grid への Durable Functions の発行

この記事では、オーケストレーション ライフサイクル イベント (作成、完了、失敗など) をカスタムの Azure Event Grid トピックに発行するように Durable Functions を設定する方法を示します。

この機能が役立つシナリオを次にいくつか示します。

  • ブルー/グリーン デプロイなどの DevOps シナリオ: 並行デプロイ戦略を実装する前に、タスクが実行されているかどうかを知ることができます。

  • 高度な監視と診断のサポート: Azure SQL Database や Azure Cosmos DB など、クエリ用に最適化された外部ストアで、オーケストレーションの状態情報を追跡できます。

  • 実行時間の長いバック グラウンド アクティビティ: 実行時間の長いバック グラウンド アクティビティに Durable Functions を使用する場合、この機能は現在の状態を知るのに役立ちます。

前提条件

カスタムの Event Grid トピックの作成

Durable Functions からイベントを送信するための Event Grid トピックを作成します。 次の手順は、Azure CLI を使用してトピックを作成する方法を示しています。 トピックの作成は、PowerShell を使用するか、Azure portal を使用しても行うことができます。

リソース グループを作成する

az group create コマンドでリソース グループを作成します。 現時点では、Azure Event Grid ではすべてのリージョンをサポートしているわけではありません。 サポートされるリージョンについては、Azure Event Grid の概要に関する記事を参照してください。

az group create --name eventResourceGroup --location westus2

カスタム トピックの作成

Event Grid のトピックは、イベントの送信先となるユーザー定義のエンドポイントになります。 <topic_name> は、トピックの一意の名前に置き換えてください。 トピック名は、DNS エントリになるため、一意である必要があります。

az eventgrid topic create --name <topic_name> -l westus2 -g eventResourceGroup

エンドポイントとキーの取得

トピックのエンドポイントを取得します。 <topic_name> を選択した名前で置き換えます。

az eventgrid topic show --name <topic_name> -g eventResourceGroup --query "endpoint" --output tsv

トピック キーを取得します。 <topic_name> を選択した名前で置き換えます。

az eventgrid topic key list --name <topic_name> -g eventResourceGroup --query "key1" --output tsv

これで、トピックにイベントを送信できます。

Event Grid の発行の構成

Durable Functions プロジェクトで、host.json ファイルを検索します。

Durable Functions 1.x

eventGridTopicEndpointeventGridKeySettingNamedurableTask プロパティに追加します。

{
  "durableTask": {
    "eventGridTopicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
    "eventGridKeySettingName": "EventGridKey"
  }
}

Durable Functions 2.x

ファイルの durableTask プロパティに notifications セクションを追加し、<topic_name> を自分で選択した名前に置換します。 durableTask または extensions プロパティが存在しない場合、次の例のように作成します。

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "notifications": {
        "eventGrid": {
          "topicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
          "keySettingName": "EventGridKey"
        }
      }
    }
  }
}

使用できる Azure Event Grid の構成プロパティについては、host.json のドキュメントを参照してください。 host.json ファイルを構成すると、関数アプリから Event Grid トピックにライフサイクル イベントが送信されます。 ローカルと Azure のどちらで関数アプリを実行しても、この処理が開始されます。

Function App と local.settings.json で、トピック キーのアプリ設定を設定します。 次の JSON は、Azure Storage エミュレーターを使用したローカル デバッグ用の local.settings.json のサンプルです。 <topic_key> はトピック キーで置き換えます。

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "EventGridKey": "<topic_key>"
    }
}

実際の Azure Storage アカウントではなく Storage エミュレーターを使用している場合は、これが実行されていることを確認してください。 実行する前に、既存のストレージ データをクリアすることをお勧めします。

実際の Azure Storage アカウントを使用している場合は、local.settings.jsonUseDevelopmentStorage=true をその接続文字列に置き換えます。

イベントをリッスンする関数の作成

Azure portal を使用して、ご使用の Durable Functions アプリによって発行されたイベントをリッスンする別の関数アプリを作成します。 Event Grid トピックと同じリージョンに配置することをお勧めします。

イベント グリッド トリガー関数の作成

  1. 関数アプリで、 [関数] を選択し、 [+ 追加] を選択します。

    Add a function in the Azure portal.

  2. Event Grid」を検索し、 [Azure Event Grid trigger](Azure Event Grid トリガー) テンプレートを選択します。

    Select the event grid trigger template in the Azure portal.

  3. 新しいトリガーに名前を付け、 [関数の作成] を選択します。

    Name the event grid trigger in the Azure portal.

    次のコードを含む関数が作成されます。

    #r "Newtonsoft.Json"
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using Microsoft.Extensions.Logging;
    
    public static void Run(JObject eventGridEvent, ILogger log)
    {
        log.LogInformation(eventGridEvent.ToString(Formatting.Indented));
    }
    

Event Grid のサブスクリプションを追加する

ここでは、作成した Event Grid トピックの Event Grid サブスクリプションを追加できます。 詳しくは、「Azure Event Grid の概念」をご覧ください。

  1. 新しい関数で、 [統合] を選択し、 [イベント グリッド トリガー (eventGridEvent)] を選択します。

    Select the Event Grid Trigger link.

  2. [Create Event Grid Description](Event Grid の説明の作成) を選択します。

    Create the Event Grid subscription.

  3. イベント サブスクリプションに名前を付け、トピックの種類として [Event Grid トピック] を選択します。

  4. サブスクリプションを選択します。 Event Grid トピック用に作成したリソース グループとリソースを選択します。

  5. [作成] を選択します

    Create an Event Grid subscription.

これで、ライフサイクル イベントを受信する準備が整いました。

Durable Functions アプリを実行してイベントを送信する

前に構成した Durable Functions プロジェクトで、ご使用のローカル コンピューターでデバッグを開始し、オーケストレーションを開始します。 アプリによって、Durable Functions ライフサイクル イベントが Event Grid に発行されます。 Azure portal でログをチェックして、作成したリスナー関数が Event Grid によってトリガーされることを確認します。

2019-04-20T09:28:21.041 [Info] Function started (Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d)
2019-04-20T09:28:21.104 [Info] {
    "id": "054fe385-c017-4ce3-b38a-052ac970c39d",
    "subject": "durable/orchestrator/Running",
    "data": {
        "hubName": "DurableFunctionsHub",
        "functionName": "Sample",
        "instanceId": "055d045b1c8a415b94f7671d8df693a6",
        "reason": "",
        "runtimeStatus": "Running"
    },
    "eventType": "orchestratorEvent",
    "eventTime": "2019-04-20T09:28:19.6492068Z",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}

2019-04-20T09:28:21.104 [Info] Function completed (Success, Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d, Duration=65ms)
2019-04-20T09:28:37.098 [Info] Function started (Id=36fadea5-198b-4345-bb8e-2837febb89a2)
2019-04-20T09:28:37.098 [Info] {
    "id": "8cf17246-fa9c-4dad-b32a-5a868104f17b",
    "subject": "durable/orchestrator/Completed",
    "data": {
        "hubName": "DurableFunctionsHub",
        "functionName": "Sample",
        "instanceId": "055d045b1c8a415b94f7671d8df693a6",
        "reason": "",
        "runtimeStatus": "Completed"
    },
    "eventType": "orchestratorEvent",
    "eventTime": "2019-04-20T09:28:36.5061317Z",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}
2019-04-20T09:28:37.098 [Info] Function completed (Success, Id=36fadea5-198b-4345-bb8e-2837febb89a2, Duration=0ms)

イベント スキーマ

次の一覧では、ライフサイクル イベントのスキーマについて説明します。

  • id :Event Grid イベントの一意識別子。
  • subject :イベントの件名へのパス。 [https://login.microsoftonline.com/consumers/](durable/orchestrator/{orchestrationRuntimeStatus}) {orchestrationRuntimeStatus}RunningCompletedFailedTerminated になります。
  • data :Durable Functions 固有のパラメーター。
    • hubName: TaskHub の名前。
    • functionName :オーケストレーター関数の名前。
    • instanceId :Durable Functions のインスタンス ID。
    • reason :追跡イベントに関連付けられている追加のデータ。 詳しくは、「Durable Functions における診断 (Azure Functions)」をご覧ください
    • runtimeStatus :オーケストレーションのランタイム状態。 実行中、完了、失敗、取り消し済みです。
  • eventType : "orchestratorEvent"
  • eventTime :イベント時間 (UTC)。
  • dataVersion :ライフサイクル イベント スキーマのバージョン。
  • metadataVersion: メタデータのバージョン。
  • topic :イベント グリッド トピック リソース。

ローカルでテストする方法

ローカルでテストする場合は、「ビューアー Web アプリでのローカル テスト」をご覧ください。 このチュートリアルで示されているように、ngrok ユーティリティを使用することもできます。

次のステップ