SpringBoot 3系のAzureFunctions実装方法ー共通設定編

以前以下の記事で、SpringBoot2.7系の場合の実装方法についてまとめた。

olafnosuke.hatenablog.com

SpringBoot3.X系の場合、一部実装方法に違いがあるので、再度実装方法についてまとめる。
今回はTriggerによらない共通実装部分について記載する。

必要なツールのインストール

Node.js(Windows 64bit版 LTS v20.14.0)

以下のサイトからインストール。
https://nodejs.org/ja/download/

Azure Functions Core Tools

コマンドプロンプトで以下のコマンドを実行する。参考

npm i -g azure-functions-core-tools@3 --unsafe-perm true

プロジェクト作成

今回は、Git上に公開されているプロジェクトを使用するのではなく、
Spring InitializrでSpringBoot3.X系のブランクプロジェクトの作成を行う。

https://start.spring.io/

上記リンクにアクセスすると、下記のようなページが表示されるので、SpringBoot3.X系であることと、Gradleプロジェクトであることを確認し、
「Project Metadata」のところに任意のプロジェクト情報を入力して「Generate」ボタンを押下する。
Zipファイルがダウンロードされるので解凍する。


build.gradle編集

Spring Initializrでダウンロードしたプロジェクトのbuild.gradleを開いて、大体以下の感じであることを確認する。
※依存関係の細かいバージョンだったり、グループIDとかは任意のものでOK

plugins {
    id 'java'
    id 'eclipse'
    // Spring Boot は3.X系を使用
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'jp.co.sample'
version = '1.0.0-SNAPSHOT'

// Java17
java {
    sourceCompatibility = '17'
    targetCompatibility = '17'
}

// Lombokのアノテーションの有効化
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // Spring
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // Lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

// Junit有効化
tasks.named('test') {
    useJUnitPlatform()
}

依存関係の追加

build.gradleにAzureFunctionsをSpringBootで実装するために必要な依存関係を追加する。

  • spring-cloud-function-adapter-azure
  • spring-cloud-starter-function-web

SpringBoot3.X系の場合、これらの依存関係は4.X系のバージョンを適用する。

最新のバージョンの確認や、Gradle定義のコピーは以下のページからそれぞれ行う。

dependencies {
    // Spring
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // ↓追加
    implementation 'org.springframework.cloud:spring-cloud-function-adapter-azure:4.1.0'
    compileOnly 'org.springframework.cloud:spring-cloud-starter-function-web:4.1.0'
    // ↑追加
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // Lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

jarファイル作成時の設定追加

SpringBootプロジェクトでは、ビルド時にプロジェクトが依存しているモジュールも内包した実行可能jarファイルと、
プレーンなjarファイルの2種類のjarファイルが生成され、それぞれファイル名は以下のようになっている。

  • 実行可能jarファイル:{プロジェクト名}-{バージョン}.jar
  • プレーンなjarファイル:{プロジェクト名}-{バージョン}-plain.jar

例えばプロジェクト名が「func」、バージョンが「1.0.0」の場合、それぞれ下記の名称でjarファイルが生成される。

  • 実行可能jarファイル:func-1.0.0.jar
  • プレーンなjarファイル:func-1.0.0-plain.jar

AzureFunctionsを起動する際に使用するのは、プレーンなjarファイルの方であり、
かつファイル名が「{プロジェクト名}-{バージョン}.jar」でないと正しく読み込めないため、
適切なjarファイルが生成されるようにbuild.gradleに設定を追加する。

// ↓追加
jar {
    // プレーンなjarファイルを作成する
    enabled = true
    // jarファイル名に識別子を付けない(デフォルト「plain」がつくようになっている)
    archiveClassifier = ''
    // mainメソッドが存在するクラスの完全修飾子を指定
    manifest {
        attributes 'Main-Class' : 'jp.co.sample.functions.FunctionsApplication'
    }
}
// ↑追加

プラグイン追加

Azure Functions Pluginを追加する。
このプラグインを追加することで、Functionsのパッケージング、ローカル環境でのFunctionsの起動・デバッグが行えるようになる。

plugins {
    id 'java'
    id 'eclipse'
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'
    // ↓追加
    id 'com.microsoft.azure.azurefunctions' version '1.14.0'
    // ↑追加
}

// ↓追加
azurefunctions {
    // Azure上関数アプリが属しているリソースグループ名
    resourceGroup = "sample-func"
    // 関数アプリ名
    appName = "java-sample"
    appSettings {
        WEBSITE_RUN_FROM_PACKAGE = '1'
        FUNCTIONS_EXTENSION_VERSION = '~3'
        FUNCTIONS_WORKER_RUNTIME = 'java'
        MAIN_CLASS = 'jp.co.sample.functions.FunctionsApplication'
    }
    authentication {
        type = 'azure_cli'
    }
    // ローカルでデバッグする際はlocalDebugを有効化する
    // localDebug = "transport=dt_socket,server=y,suspend=n,address=5005"
    deployment {
        type = 'run_from_blob'
    }
}
// ↑追加

ここまでで、AzureFunctionsを実装するために必要となるプロジェクトの設定が完了となる。
次回以降はTriggerごとの実装方法の説明をしていく。