EventGrid TriggerのAzure Functionをローカルで動かす方法

Azure Function のトリガーの種類により、ローカルでの実行方法が異なります。

  • HTTP トリガー

    • http://localhost:<PORT>/api/<FUNCTION_NAME> にリクエストする事で実行できます。
  • (EventGrid Trigger を除く) HTTP トリガー以外

  • EventGrid トリガー

    • EventGrid Trigger の URL (= http://localhost:7071/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}) にリクエストする事で実行できます。

ドキュメントはこちら
Core Tools を使用してローカルで Azure Functions を開発する - ローカル関数を実行する

EventGrid TriggerのAzure Functionをローカルで動かす方法 を以下に記載します。

バージョン

  • Azure Function Runtime Version: 4.25.3.21264
  • Azure Functions Core Tools: 4.0.5413 Commit hash: N/A (64-bit)

今回やった事

  1. Azure Functions extension for Visual Studio CodeEventGrid トリガーの Azure Function を作成
  2. Event Grid Viewerアプリ で EventGrid のイベントメッセージを取得
    • EventGrid Trigger の URL にリクエストする際、 Request Body でイベントメッセージを指定する必要がある為、予め実際のイベントメッセージを取得しておきます
  3. Azure Functions Core Toolsfunc コマンド で Azure Function をローカルでホスト
  4. EventGrid Trigger の URL にリクエストし、ローカルでホストしている Azure Function をトリガー

1. Azure Functions extension for Visual Studio CodeEventGrid トリガーの Azure Function を作成

今回は Azure Functions extension for Visual Studio Code を利用して Azure Function を作成します。

ドキュメント

手順

  1. VSCode > Azure Functions extension > WORCSPACE の Function アイコンより、Create New Project... を押下

  2. TypeScript, Model V4, Azure Event Grid Trigger と選択し、関数名を入力(今回は eventGridTriggerSample)し、Enterを押下すると、eventGridTriggerSample 関数 が作成される

2. Event Grid Viewer アプリ で EventGrid のイベントメッセージを取得

EventGrid Trigger の URL にリクエストする際、 Request Body でイベントメッセージを指定する必要がある為、予め実際のイベントメッセージを取得しておきます。

今回は Azure BLOB Storage Container へファイルがアップロードされた際のイベントメッセージを、Event Grid Viewerアプリで取得します 。

2-1. Event Grid Viewer アプリをデプロイ

Event Grid Viewer アプリ = ドキュメントの ビューアー Web アプリ の事。

EventGridのイベントメッセージをキャプチャする為の Event Grid Viewer アプリ を、learn.microsoft.com にあるARMテンプレートを利用して Azure AppService にカスタム デプロイします。

ドキュメント

手順

  1. learn.microsoft.com の ビューアー Web アプリを作成するより、Deploy to Azure ボタンを押下

  2. ブラウザで https://portal.azure.com/#create/Microsoft.Template が起動するので、サブスクリプション/リソースグループと、インスタンスの詳細を入力

  3. デプロイが成功すると以下のリソースが作成される

2-2. Event Grid の イベント サブスクリプション を作成

ドキュメント

手順

  1. ファイルのアップロード先となる Azure BLOB Storage Container を作成

    • ストレージアカウント を作成
    • ストレージアカウントデータストレージ: コンテナー (コンテナ名: upload) を作成
  2. Event Grid の イベント サブスクリプション を作成 (※1)

    • サブスクリプションEvent Grid リソース プロバイダー を登録
    • Event Grid システム トピック 及び イベント サブスクリプション を作成
      • イベント サブスクリプション > 「+ イベントブスクリプション」 より以下の内容で作成
        • トピックの種類
          • ストレージアカウント
        • ソースリソース
          • 上記で作成したストレージアカウント
        • エンドポイントのタイプ
          • webhook
        • エンドポイント ※イベントの送信先
          • https://{「Event Grid Viewer アプリ」のドメイン}/api/updates
            • 今回の例: https://viewerwebapptest1698469260.azurewebsites.net/api/updates

※1 ハマりどころ

Azure Portalのバグなのか Event Grid トピック > (対象のトピックを選択) > 「+ イベントブスクリプション」 からだとサブスクリプションが作成できなかった

2-3. Event Grid Viewer アプリ で EventGrid のイベントメッセージをキャプチャ

手順

  1. ブラウザで Event Grid Viewer アプリ を開いておく

  2. 上記で作成した Azure BLOB Storage Container にファイルをアップロード

  3. Event Grid Viewer アプリEvent Grid イベント メッセージ が届くので、Web上でメッセージ内容を確認

{
  "topic": "/subscriptions/c86f8ad8-7f32-4f84-8cf5-9ba182bd2a40/resourceGroups/event-grid-trigger-sample/providers/Microsoft.Storage/storageAccounts/storageaccount1698469260",
  "subject": "/blobServices/default/containers/upload/blobs/2023/10/28/test.txt",
  "eventType": "Microsoft.Storage.BlobCreated",
  "id": "1afcef29-f01e-0079-4e61-09740a066060",
  "data": {
    "api": "PutBlob",
    "clientRequestId": "50bdeec1-31cb-4fa4-b783-ea6fbb26400d",
    "requestId": "1afcef29-f01e-0079-4e61-09740a000000",
    "eTag": "0x8DBD778B179D29D",
    "contentType": "text/plain",
    "contentLength": 4,
    "blobType": "BlockBlob",
    "url": "https://storageaccount1698469260.blob.core.windows.net/upload/2023/10/28/test.txt",
    "sequencer": "0000000000000000000000000000EC5E000000000009cc7f",
    "storageDiagnostics": {
      "batchId": "3875e5f8-9006-0022-0061-094d31000000"
    }
  },
  "dataVersion": "",
  "metadataVersion": "1",
  "eventTime": "2023-10-28T05:42:37.6655517Z"
}

3. Azure Functions Core Toolsfunc コマンド で Azure Function をローカルでホスト

Azure Functions Core Toolsfunc コマンド で Azure Function をローカルで起動します

ドキュメント

手順

  • Azurite コンテナを起動

    • docker run -p 10000:10000 -p 10001:10001 mcr.microsoft.com/azure-storage/azurite
  • プロジェクトの直下に local.settings.json を以下の内容で設置

    • "AzureWebJobsStorage": "UseDevelopmentStorage=true" は azurite を使用する設定
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
  }
}
  • tsc で TypeScript を JavaScript に変換

    • yarn build
  • funcコマンド で eventGridTriggerSample 関数をローカルで起動

    • func start eventGridTriggerSample --typescript
$ func start eventGridTriggerSample --typescript

Azure Functions Core Tools
Core Tools Version:       4.0.5413 Commit hash: N/A  (64-bit)
Function Runtime Version: 4.25.3.21264

[2023-10-28T06:06:17.001Z] Worker process started and initialized.

Functions:

    eventGridTriggerSample: eventGridTrigger

For detailed output, run func with --verbose flag.
[2023-10-28T06:06:22.030Z] Host lock lease acquired by instance ID '000000000000000000000000816E9EDC'.

EventGrid Trigger の URL にリクエストし、ローカルでホストしている Azure Function をトリガー

EventGrid Trigger の URL を呼び出すことで EventGrid Trigger の Azure Function をローカルで実行する事ができます。

ドキュメント

EventGrid Trigger の URL

  • http://localhost:7071/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}

手順

  1. EventGrid Trigger の URL にリクエス
    • Request Body で上記で取得した 「EventGried の イベントメッセージ」を指定して POST
curl http://localhost:7071/runtime/webhooks/eventgrid?functionName=eventGridTriggerSample \
-H "Content-Type: application/json" \
-H "aeg-event-type: Notification" \
-d '{
  "topic": "/subscriptions/c86f8ad8-7f32-4f84-8cf5-9ba182bd2a40/resourceGroups/event-grid-trigger-sample/providers/Microsoft.Storage/storageAccounts/storageaccount1698469260",
  "subject": "/blobServices/default/containers/upload/blobs/2023/10/28/test.txt",
  "eventType": "Microsoft.Storage.BlobCreated",
  "id": "1afcef29-f01e-0079-4e61-09740a066060",
  "data": {
    "api": "PutBlob",
    "clientRequestId": "50bdeec1-31cb-4fa4-b783-ea6fbb26400d",
    "requestId": "1afcef29-f01e-0079-4e61-09740a000000",
    "eTag": "0x8DBD778B179D29D",
    "contentType": "text/plain",
    "contentLength": 4,
    "blobType": "BlockBlob",
    "url": "https://storageaccount1698469260.blob.core.windows.net/upload/2023/10/28/test.txt",
    "sequencer": "0000000000000000000000000000EC5E000000000009cc7f",
    "storageDiagnostics": {
      "batchId": "3875e5f8-9006-0022-0061-094d31000000"
    }
  },
  "dataVersion": "",
  "metadataVersion": "1",
  "eventTime": "2023-10-28T05:42:37.6655517Z"
}' --verbose

作業ログ: EventGrid Trigger の URL にリクエストし、eventGridTriggerSample 関数をトリガーした様子

$ curl http://localhost:7071/runtime/webhooks/eventgrid?functionName=eventGridTriggerSample \
> -H "Content-Type: application/json" \
> -H "aeg-event-type: Notification" \
> -d '{
>   "topic": "/subscriptions/c86f8ad8-7f32-4f84-8cf5-9ba182bd2a40/resourceGroups/event-grid-trigger-sample/providers/Microsoft.Storage/storageAccounts/storageaccount1698469260",
>   "subject": "/blobServices/default/containers/upload/blobs/2023/10/28/test.txt",
>   "eventType": "Microsoft.Storage.BlobCreated",
>   "id": "1afcef29-f01e-0079-4e61-09740a066060",
>   "data": {
>     "api": "PutBlob",
>     "clientRequestId": "50bdeec1-31cb-4fa4-b783-ea6fbb26400d",
>     "requestId": "1afcef29-f01e-0079-4e61-09740a000000",
>     "eTag": "0x8DBD778B179D29D",
>     "contentType": "text/plain",
>     "contentLength": 4,
>     "blobType": "BlockBlob",
>     "url": "https://storageaccount1698469260.blob.core.windows.net/upload/2023/10/28/test.txt",
>     "sequencer": "0000000000000000000000000000EC5E000000000009cc7f",
>     "storageDiagnostics": {
>       "batchId": "3875e5f8-9006-0022-0061-094d31000000"
>     }
>   },
>   "dataVersion": "",
>   "metadataVersion": "1",
>   "eventTime": "2023-10-28T05:42:37.6655517Z"
> }' --verbose
*   Trying 127.0.0.1:7071...
* Connected to localhost (127.0.0.1) port 7071 (#0)
> POST /runtime/webhooks/eventgrid?functionName=eventGridTriggerSample HTTP/1.1
> Host: localhost:7071
> User-Agent: curl/8.1.2
> Accept: */*
> Content-Type: application/json
> aeg-event-type: Notification
> Content-Length: 983
>
< HTTP/1.1 202 Accepted
< Content-Length: 0
< Date: Sat, 28 Oct 2023 06:28:51 GMT
< Server: Kestrel
<
* Connection #0 to host localhost left intact
~ $
  • eventGridTriggerSample 関数がトリガーされた
[2023-10-28T06:28:51.995Z] Executing 'Functions.eventGridTriggerSample' (Reason='EventGrid trigger fired at 2023-10-28T15:28:51.9435940+09:00', Id=ca807f6d-683c-4ddd-a68c-4e088fa4e650)
[2023-10-28T06:28:52.081Z] Event grid function processed event: {
[2023-10-28T06:28:52.081Z]   topic: '/subscriptions/c86f8ad8-7f32-4f84-8cf5-9ba182bd2a40/resourceGroups/event-grid-trigger-sample/providers/Microsoft.Storage/storageAccounts/storageaccount1698469260',
[2023-10-28T06:28:52.081Z]   subject: '/blobServices/default/containers/upload/blobs/2023/10/28/test.txt',
[2023-10-28T06:28:52.081Z]   eventType: 'Microsoft.Storage.BlobCreated',
[2023-10-28T06:28:52.081Z]   id: '1afcef29-f01e-0079-4e61-09740a066060',
[2023-10-28T06:28:52.081Z]   data: {
[2023-10-28T06:28:52.081Z]     api: 'PutBlob',
[2023-10-28T06:28:52.081Z]     clientRequestId: '50bdeec1-31cb-4fa4-b783-ea6fbb26400d',
[2023-10-28T06:28:52.081Z]     requestId: '1afcef29-f01e-0079-4e61-09740a000000',
[2023-10-28T06:28:52.081Z]     eTag: '0x8DBD778B179D29D',
[2023-10-28T06:28:52.081Z]     contentType: 'text/plain',
[2023-10-28T06:28:52.081Z]     contentLength: 4,
[2023-10-28T06:28:52.081Z]     blobType: 'BlockBlob',
[2023-10-28T06:28:52.081Z]     url: 'https://storageaccount1698469260.blob.core.windows.net/upload/2023/10/28/test.txt',
[2023-10-28T06:28:52.081Z]     sequencer: '0000000000000000000000000000EC5E000000000009cc7f',
[2023-10-28T06:28:52.081Z]     storageDiagnostics: { batchId: '3875e5f8-9006-0022-0061-094d31000000' }
[2023-10-28T06:28:52.081Z]   },
[2023-10-28T06:28:52.081Z]   dataVersion: '',
[2023-10-28T06:28:52.081Z]   metadataVersion: '1',
[2023-10-28T06:28:52.081Z]   eventTime: '2023-10-28T05:42:37.6655517Z'
[2023-10-28T06:28:52.081Z] }
[2023-10-28T06:28:52.112Z] Executed 'Functions.eventGridTriggerSample' (Succeeded, Id=ca807f6d-683c-4ddd-a68c-4e088fa4e650, Duration=155ms)

サンプル