Azure Event Grid への Durable Functions の発行
この記事では、オーケストレーション ライフサイクル イベント (作成、完了、失敗など) をカスタムの Azure Event Grid トピックに発行するように Durable Functions を設定する方法を示します。
この機能が役立つシナリオを次にいくつか示します。
ブルー/グリーン デプロイなどの DevOps シナリオ: 並行デプロイ戦略を実装する前に、タスクが実行されているかどうかを知ることができます。
高度な監視と診断のサポート: Azure SQL Database や Azure Cosmos DB など、クエリ用に最適化された外部ストアで、オーケストレーションの状態情報を追跡できます。
実行時間の長いバック グラウンド アクティビティ: 実行時間の長いバック グラウンド アクティビティに Durable Functions を使用する場合、この機能は現在の状態を知るのに役立ちます。
前提条件
- Microsoft.Azure.WebJobs.Extensions.DurableTask を Durable Functions プロジェクトにインストールします。
- Azurite ストレージ エミュレーターをインストールするか既存の Azure Storage アカウントを使用します。
- Azure CLI をインストールするか、Azure Cloud Shell を使用します
カスタムの 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
eventGridTopicEndpoint
と eventGridKeySettingName
を durableTask
プロパティに追加します。
{
"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.json
の UseDevelopmentStorage=true
をその接続文字列に置き換えます。
イベントをリッスンする関数の作成
Azure portal を使用して、ご使用の Durable Functions アプリによって発行されたイベントをリッスンする別の関数アプリを作成します。 Event Grid トピックと同じリージョンに配置することをお勧めします。
イベント グリッド トリガー関数の作成
関数アプリで、 [関数] を選択し、 [+ 追加] を選択します。
「Event Grid」を検索し、 [Azure Event Grid trigger](Azure Event Grid トリガー) テンプレートを選択します。
新しいトリガーに名前を付け、 [関数の作成] を選択します。
次のコードを含む関数が作成されます。
#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 の概念」をご覧ください。
新しい関数で、 [統合] を選択し、 [イベント グリッド トリガー (eventGridEvent)] を選択します。
[Create Event Grid Description](Event Grid の説明の作成) を選択します。
イベント サブスクリプションに名前を付け、トピックの種類として [Event Grid トピック] を選択します。
サブスクリプションを選択します。 Event Grid トピック用に作成したリソース グループとリソースを選択します。
[作成] を選択します
これで、ライフサイクル イベントを受信する準備が整いました。
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
:イベントの件名へのパス。durable/orchestrator/{orchestrationRuntimeStatus}
{orchestrationRuntimeStatus}
はRunning
、Completed
、Failed
、Terminated
になります。data
:Durable Functions 固有のパラメーター。hubName
: TaskHub の名前。functionName
:オーケストレーター関数の名前。instanceId
:Durable Functions のインスタンス ID。reason
:追跡イベントに関連付けられている追加のデータ。 詳しくは、「Durable Functions における診断 (Azure Functions)」をご覧くださいruntimeStatus
:オーケストレーションのランタイム状態。 実行中、完了、失敗、取り消し済みです。
eventType
: "orchestratorEvent"eventTime
:イベント時間 (UTC)。dataVersion
:ライフサイクル イベント スキーマのバージョン。metadataVersion
: メタデータのバージョン。topic
: Event Grid トピック リソース。
ローカルでテストする方法
ローカルでテストする場合は、「ビューアー Web アプリでのローカル テスト」をご覧ください。