Azure Function のトリガーの種類により、ローカルでの実行方法が異なります。
ドキュメントはこちら
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 システム トピック
及び イベント サブスクリプション
を作成
イベント サブスクリプション > 「+ イベントブスクリプション」
より以下の内容で作成
- トピックの種類
- ソースリソース
- エンドポイントのタイプ
- エンドポイント ※イベントの送信先
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"
}
Azure Functions Core Tools
の func コマンド
で Azure Function をローカルで起動します
ドキュメント
手順
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "node",
"AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
}
}
$ 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)
サンプル