SpringBoot 3.X系での AzureFunctionsのHttpTrigger実装方法

Spring Boot3.X系 でAzure FunctionsのHTTP Triggerを実装する手順を示す。

プロジェクトの作成は以下の記事参照。

olafnosuke.hatenablog.com

SpringBoot2.X系の実装方法は以下の記事参照。

olafnosuke.hatenablog.com


Functionクラスの作成

Functionクラスには、ファンクションごとに行いたい処理を記述する。
FunctionクラスはHandlerクラスから呼び出されて処理を実装するため、DIコンテナに登録されるように「@Componentアノテーションを付与している。

/**
 * HttpTriggerの処理
 */
@Component
@Slf4j
public class HttpFunction implements Function<String, String> {

    /**
     * {@inheritDoc}
     */
    @Override
    public String apply(String t) {
        log.info("あいうえお");
        return t + "!!";
    }
}

Handlerクラスの作成

AzureFunctionの実装用に追加した「spring-cloud-function-adapter-azure」「spring-cloud-starter-function-web」のバージョン3.X系→4.x系の変更に伴い、Functionクラスを呼び出す処理の実装方法が変更となった。
※3.X系では「FunctionInvoker」を継承して、Functionクラスを呼び出す処理を実装していたが、「FunctionInvoker」が4.X系では非推奨となったため。

4.X系ではHandlerクラスもDIコンテナに登録し、HandlerクラスにFunctionクラスをDIする。
クラス内に定義した「@FunctionName」アノテーションを付与したメソッドの中で、Functionクラスを任意のタイミングで実行するように処理を記述する。

/**
 * サンプルHttp Trigger
 */
@Component
public class HttpHandler {

    /** {@link HttpFunction} */
    private HttpFunction httpFunction;

    /**
     * コンストラクタ。
     * 
     * @param httpFunction
     *          {@link HttpFunction}
     */
    public HttpHandler(HttpFunction httpFunction) {
        this.httpFunction = httpFunction;
    }

    @FunctionName("spring")
    public String httpTrigger(
        @HttpTrigger(name = "req", methods = HttpMethod.POST, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
          ExecutionContext context) {

        return this.httpFunction.apply(request.getBody().get());
    }
}

HTTPトリガーの設定

HTTPトリガーの設定はアノテーションで行う。@FunctionName("spring")を付与したメソッドの引数に
com.microsoft.azure.functions.annotation.HttpTriggerを付与する。
※どの引数でも良いというわけではなく、リクエスト情報を格納する引数に付与する必要があるので注意する

アノテーションの属性については以下の通り。

属性名 説明
name リクエストやリクエストボディのファンクションコードで使用される変数名。必須
dataType パラメータ値をどのように扱うかを定義する。以下の値が設定可能。
"":値を文字列として取得し、POJOにデシリアライズする(デフォルト
string:常に文字列として値を取得する
binary:値をバイナリデータとして取得し、byte[]にデシリアライズする
route 関数がどのリクエストURLに応答するかを制御する。
デフォルトでは、http://<関数アプリ名>.azurewebsites.net/api/<ファンクション名>のURLとなる。
methods このファンクションが応答するHTTPメソッドの配列。
指定しない場合は全てのHTTPメソッドで応答する(デフォルト
authLevel ファンクションを起動するための認証レベルを設定する。
anonymous:APIキー不要
function:関数固有のAPIキーが必要(デフォルト
admin:マスターキーが必要
〇参考:APIキーの種類
キー 説明
マスターキー 各関数アプリに_masterという管理レベルのキーとして存在する。
このキーを削除することや、キーの値を変更することはできない。
ホストキー 関数アプリ内のすべての関数で使用可能なキー。
関数キー 特定の関数でのみ使用可能なキー。
// 記述例
public String httpTrigger(
      @HttpTrigger(name = "req", methods = HttpMethod.POST, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
      ExecutionContext context) {
}

ローカルでの動作確認

ファンクションの作成完了後にプロジェクトをビルドする。

gradlew azureFunctionsPackage

ビルド成功後に、ファンクションを起動する。

gradlew azureFunctionsRun

起動に成功すると以下のようにファンクションの一覧が表示される。

> Task :azureFunctionsRun
Azure Function App's staging directory found at: C:\workspace\functions\build\azure-functions\java-template-func

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

Functions:

        spring: [POST] http://localhost:7071/api/spring

記載されているURLに[]内に書かれているメソッドでリクエストを送ることでファンクションの動作確認を行うことが出来る。