前回は、EventGridTriggerを利用して、BlobにCSVファイルが作成されたタイミングで、そのCSVファイルをDBに書き込む処理を作成してみたが、このサンプルプログラムは、ローカル環境でも動作することができる。
今回は、EventGridTriggerを利用したプログラムをローカル環境で動作させてみたので、その手順を共有する。
前提条件
下記記事のサンプルプログラムを作成済であること。
また、以下の記事のPostmanをインストール済であること。
作成したサンプルプログラムの修正
前提条件の記事のサンプルプログラムに、EventGridTriggerによってログを出力するメソッドを追加する。なお、下記の赤枠は、前提条件のプログラムから変更したプログラムである。
EventGridのハンドラークラスの内容は以下の通りで、EventGridTriggerアノテーションを付与したクラスで、EventGridTriggerによってログを出力するメソッドを追加している。なお、サンプルプログラムを動作する際は、このクラスのどちらかのメソッドをコメントアウトして動作させるものとする。
package com.example; import java.time.LocalDateTime; import org.springframework.cloud.function.adapter.azure.FunctionInvoker; import com.example.model.EventGridTriggerParam; import com.example.model.EventGridTriggerResult; import com.example.model.EventSchema; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.EventGridTrigger; import com.microsoft.azure.functions.annotation.FunctionName; public class EventGridTriggerTestHandler extends FunctionInvoker<EventGridTriggerParam, EventGridTriggerResult> { /** * EventGridTriggerによって、DemoAzureFunctionクラスのeventGridTriggerTestメソッド * を呼び出す. * @param event EventGridTriggerイベント情報 * @param context コンテキストオブジェクト */ @FunctionName("eventGridTriggerTest") public void eventGridTriggerTest( @EventGridTrigger(name = "event") EventSchema event, final ExecutionContext context) { context.getLogger().info( "EventGridTriggerTestHandler eventGridTriggerTest triggered: " + event.eventTime); // EventGridTriggerイベント情報から、Blob Storageの読み込むファイル名を取得し、 // EventGridTriggerParamに設定する EventGridTriggerParam param = new EventGridTriggerParam(); String subject = event.subject; param.setFileName(subject.substring(subject.lastIndexOf("/") + 1)); param.setTimerInfo(LocalDateTime.now().toString()); handleRequest(param, context); } /** * EventGridTriggerによって、DemoAzureFunctionクラスのeventGridTriggerTestメソッド * を呼び出す. * @param event EventGridTriggerイベント情報 * @param context コンテキストオブジェクト */ @FunctionName("eventGridTriggerTest") public void eventGridTriggerTest(@EventGridTrigger(name = "event") String event, final ExecutionContext context) { // EventGridTriggerイベント情報をログに出力する context.getLogger().info( "EventGridTriggerTestHandler eventGridTriggerTest triggered: " + LocalDateTime.now().toString()); context.getLogger().info(event); } }
また、デフォルトではSpring Batch起動時にジョブが実行されるが、その指定だとSpring Batch起動直後にローカルで実行するとエラーになるため、以下のように、application.propertiesに「spring.batch.job.enabled=false」という設定を追加する。
# Azure Storageの接続先 azure.storage.accountName=azureblobpurinit azure.storage.accessKey=(Azure Blob Storageのアクセスキー) azure.storage.containerName=blobcontainer # DB接続設定 spring.datasource.url=jdbc:sqlserver://azure-db-purinit.database.windows.net:1433;database=azureSqlDatabase spring.datasource.username=purinit@azure-db-purinit spring.datasource.password=(DBのパスワード) spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver # Spring Batch起動時にジョブを自動実行しないための設定 spring.batch.job.enabled=false
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/event-grid-trigger-local/demoAzureFunc
その後、以下のように、EventGridのハンドラークラスのログ出力する処理を残した状態で、Azure環境にデプロイする。
なお、Azure環境へのデプロイ手順や、ログの確認手順は、以下のサイトの「サンプルプログラムの実行結果(ローカル)」「サンプルプログラムの実行結果(Azure上)」に記載されている通りである。
EventGridのハンドラークラスのログを取得
先ほどAzure環境へのデプロイしたサンプルプログラムから、EventGridのハンドラークラスのログを取得する。その実行結果は、以下の通り。
2) 上記CSVファイルを、EventGridTriggerを設定したBlob上に配置する。
3) EventGridTriggerによってファイルがDBに取り込まれた後に、Azure Functionsのログを確認した結果は、以下の通りで、赤枠の部分でEventGridTriggerイベント情報のログが確認できる。この内容をあらかじめコピーしておく。なお、今回はCSVファイルの内容をDBに取り込まないので、EventGridTriggerによってファイルはそのまま置かれた状態となる。
EventGridのローカル環境での実行
EventGridを利用してCSVファイルの内容をDBに書き込む処理をローカル環境で実行した結果は、以下の通り。
1) 以下のように、EventGridのCSVをDBに書き込む処理を残した状態で、サンプルプログラムを実行する。
なお、ローカル環境での実行手順は、以下のサイトの「サンプルプログラムの実行結果(ローカル)」に記載されている通りである。
3) 上記CSVファイルを、EventGridTriggerを設定したBlob上に配置する。
5) Postmanを起動し、以下の内容を指定した上で、「Send」ボタンを押下する。
- URLに「http://localhost:7071/runtime/webhooks/eventgrid?functionName={FunctionName}」を指定
- HTTPメソッドに「POST」を指定
- ヘッダーに「Content-Type:application/json」「aeg-event-type:Notification」を追加
- リクエストボディに、EventGridTriggerイベント情報のログの内容を貼り付け
6) リクエストを実行すると、ステータスが「202 Accepted」でリクエストが受理されたことが確認できる。
7) リクエスト実行後のログ、Blob、DBの内容は以下の通りで、ローカル環境でのCSVファイル取込処理が正常に動作したことが確認できる。
要点まとめ
- PostmanやEventGridTriggerイベント情報のログを利用することで、EventGridTriggerを利用したプログラムをローカル環境で実行することができる。