Azure Function のトリガーの種類により、ローカルでの実行方法が異なります。
HTTP トリガー
http://localhost:<PORT>/api/<FUNCTION_NAME>
にリクエストする事で実行できます。
(EventGrid Trigger を除く) HTTP トリガー以外
- Azure Function の 管理者エンドポイント ( =
http://localhost:<PORT>/admin/functions/<FUNCTION_NAME>
) にリクエストする事で実行できます。
- Azure Function の 管理者エンドポイント ( =
EventGrid トリガー
- EventGrid Trigger の URL (=
http://localhost:7071/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}
) にリクエストする事で実行できます。
- EventGrid Trigger の URL (=
ドキュメントはこちら
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)
今回やった事
- Azure Functions extension for Visual Studio Code で
EventGrid トリガーの Azure Function
を作成 - Event Grid Viewerアプリ で EventGrid のイベントメッセージを取得
EventGrid Trigger の URL
にリクエストする際、 Request Body でイベントメッセージを指定する必要がある為、予め実際のイベントメッセージを取得しておきます
- Azure Functions Core Tools の
func コマンド
で Azure Function をローカルでホスト - EventGrid Trigger の URL にリクエストし、ローカルでホストしている Azure Function をトリガー
1. Azure Functions extension for Visual Studio Code
で EventGrid トリガーの Azure Function
を作成
今回は Azure Functions extension for Visual Studio Code を利用して Azure Function を作成します。
ドキュメント
手順
VSCode > Azure Functions extension > WORCSPACE
の Function アイコンより、Create New Project...
を押下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 にカスタム デプロイします。
ドキュメント
手順
learn.microsoft.com の ビューアー Web アプリを作成するより、
Deploy to Azure
ボタンを押下ブラウザで https://portal.azure.com/#create/Microsoft.Template が起動するので、サブスクリプション/リソースグループと、インスタンスの詳細を入力
デプロイが成功すると以下のリソースが作成される
2-2. Event Grid の イベント サブスクリプション
を作成
ドキュメント
手順
ファイルのアップロード先となる
Azure BLOB Storage Container
を作成ストレージアカウント
を作成ストレージアカウント
にデータストレージ: コンテナー
(コンテナ名: upload) を作成
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 のイベントメッセージをキャプチャ
手順
ブラウザで
Event Grid Viewer アプリ
を開いておく上記で作成した
Azure BLOB Storage Container
にファイルをアップロード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 Tools
の func コマンド
で Azure Function をローカルでホスト
Azure Functions Core Tools
の func コマンド
で 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}
手順
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)