EventGridTrigger/SpringBatch

EventGridTriggerを利用したプログラムをローカル環境で動かしてみた

前回は、EventGridTriggerを利用して、BlobにCSVファイルが作成されたタイミングで、そのCSVファイルをDBに書き込む処理を作成してみたが、このサンプルプログラムは、ローカル環境でも動作することができる。

今回は、EventGridTriggerを利用したプログラムをローカル環境で動作させてみたので、その手順を共有する。

前提条件

下記記事のサンプルプログラムを作成済であること。

Azure Functions上でSpring Batchを利用しているプログラムをEventGridTriggerによって動かしてみた(ソースコード編)これまでこのブログでは、TimerTriggerを利用してBlob上のCSVファイルをDBに書き込む処理を作成していたが、EventGr...

また、以下の記事のPostmanをインストール済であること。

POSTメソッドでリクエストされるAzure FunctionsのAPIをPostmanによって呼び出してみたAzure App Serviceを利用せずに、HTTPトリガーによって呼び出されるAzure Functionsの動作確認を行うには、...

作成したサンプルプログラムの修正

前提条件の記事のサンプルプログラムに、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環境にデプロイする。
EventGridTriggerTestHandler_コメントアウト

なお、Azure環境へのデプロイ手順や、ログの確認手順は、以下のサイトの「サンプルプログラムの実行結果(ローカル)」「サンプルプログラムの実行結果(Azure上)」に記載されている通りである。

Azure Functions上でTimerTriggerによって動作するJavaアプリケーション(Spring Boot上)を作成してみたこれまでは、HTTPリクエストによりAzure Functionsが動作するアプリケーションのみ作成してきたが、Timer Trigge...



EventGridのハンドラークラスのログを取得

先ほどAzure環境へのデプロイしたサンプルプログラムから、EventGridのハンドラークラスのログを取得する。その実行結果は、以下の通り。

1) 配置するCSVファイルの内容は、以下の通り。
EventGridログ取得_1

2) 上記CSVファイルを、EventGridTriggerを設定したBlob上に配置する。
EventGridログ取得_2

3) EventGridTriggerによってファイルがDBに取り込まれた後に、Azure Functionsのログを確認した結果は、以下の通りで、赤枠の部分でEventGridTriggerイベント情報のログが確認できる。この内容をあらかじめコピーしておく。なお、今回はCSVファイルの内容をDBに取り込まないので、EventGridTriggerによってファイルはそのまま置かれた状態となる。
EventGridログ取得_3



EventGridのローカル環境での実行

EventGridを利用してCSVファイルの内容をDBに書き込む処理をローカル環境で実行した結果は、以下の通り。

1) 以下のように、EventGridのCSVをDBに書き込む処理を残した状態で、サンプルプログラムを実行する。
EventGridローカル実行_1

なお、ローカル環境での実行手順は、以下のサイトの「サンプルプログラムの実行結果(ローカル)」に記載されている通りである。

Azure Functions上でTimerTriggerによって動作するJavaアプリケーション(Spring Boot上)を作成してみたこれまでは、HTTPリクエストによりAzure Functionsが動作するアプリケーションのみ作成してきたが、Timer Trigge...

2) 配置するCSVファイルの内容は、以下の通り。
EventGridローカル実行_2

3) 上記CSVファイルを、EventGridTriggerを設定したBlob上に配置する。
EventGridローカル実行_3

4) Azure Functionsをローカルで起動する。
EventGridローカル実行_4

5) Postmanを起動し、以下の内容を指定した上で、「Send」ボタンを押下する。

  • URLに「http://localhost:7071/runtime/webhooks/eventgrid?functionName={FunctionName}」を指定
  • HTTPメソッドに「POST」を指定
  • ヘッダーに「Content-Type:application/json」「aeg-event-type:Notification」を追加
  • リクエストボディに、EventGridTriggerイベント情報のログの内容を貼り付け
EventGridローカル実行_5_1 EventGridローカル実行_5_2 EventGridローカル実行_5_3

6) リクエストを実行すると、ステータスが「202 Accepted」でリクエストが受理されたことが確認できる。
EventGridローカル実行_6

7) リクエスト実行後のログ、Blob、DBの内容は以下の通りで、ローカル環境でのCSVファイル取込処理が正常に動作したことが確認できる。
EventGridローカル実行_7_log

EventGridローカル実行_7_CSV EventGridローカル実行_7_DB

要点まとめ

  • PostmanやEventGridTriggerイベント情報のログを利用することで、EventGridTriggerを利用したプログラムをローカル環境で実行することができる。