Azure の Spring Cloud 関数
この記事では、Spring Cloud Functions を使用して Java 関数を開発し、Azure Functions に発行する方法について説明します。 完了すると、関数コードは Azure の 従量課金プラン で実行され、HTTP 要求を使用してトリガーできます。
前提 条件
- Azure サブスクリプション。 Azure サブスクリプションがない場合は、開始する前に 無料アカウント を作成します。
Java を使用して関数を開発するには、次のものがインストールされている必要があります。
- Java Developer Kitバージョン 11
- Apache Mavenバージョン 3.0 以降
- Azure CLI
- Azure Functions Core Tools バージョン 4
重要
- このクイック スタートを完了するには、
JAVA_HOME
環境変数を JDK のインストール場所に設定する必要があります。 - コア ツールのバージョンが 4.0.5455 以上であることを確認します。
これから作るもの
ここでは、Azure Functions で実行され、Spring Cloud 関数を使用して構成される従来の "Hello, World" 関数を構築します。
この関数は、ユーザー名を含む User
JSON オブジェクトを受け取り、そのユーザーにウェルカム メッセージを含む Greeting
オブジェクトを返します。
このプロジェクトは、GitHub の
新しい Maven プロジェクトを作成する
空の Maven プロジェクトを作成し、Spring Cloud 関数と Azure Functions を使用して構成します。
空のフォルダーに新しい pom.xml ファイルを作成し、サンプル プロジェクトの pom.xml ファイルからコンテンツをコピー/貼り付けます。
手記
このファイルは、Spring Boot と Spring Cloud Function の両方の Maven 依存関係を使用し、Spring Boot と Azure Functions Maven プラグインを構成します。
アプリケーションのいくつかのプロパティをカスタマイズする必要があります。
<functionAppName>
は Azure 関数の名前です<functionAppRegion>
は、関数がデプロイされている Azure リージョンの名前です<functionResourceGroup>
は、使用している Azure リソース グループの名前です
次の例に示すように、pom.xml ファイルの先頭付近にあるプロパティを直接変更します。
<properties>
<java.version>11</java.version>
<!-- Spring Boot start class. WARNING: correct class must be set -->
<start-class>com.example.DemoApplication</start-class>
<!-- customize those properties. WARNING: the functionAppName should be unique across Azure -->
<azure.functions.maven.plugin.version>1.36.0</azure.functions.maven.plugin.version>
<functionResourceGroup>my-spring-function-resource-group</functionResourceGroup>
<functionAppServicePlanName>my-spring-function-service-plan</functionAppServicePlanName>
<functionAppName>my-spring-function</functionAppName>
<functionPricingTier>Y1</functionPricingTier>
<functionAppRegion>eastus</functionAppRegion>
</properties>
Azure 構成ファイルを作成する
src/main/resources フォルダーを作成し、それに次の Azure Functions 構成ファイルを追加します。
host.json:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.2.0)"
},
"functionTimeout": "00:10:00"
}
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "java",
"FUNCTIONS_EXTENSION_VERSION": "~4",
"AzureWebJobsDashboard": ""
}
}
ドメイン オブジェクトを作成する
Azure Functions では、JSON 形式でオブジェクトを送受信できます。
次に、ドメイン モデルを表す User
オブジェクトと Greeting
オブジェクトを作成します。
このクイック スタートをカスタマイズして興味を引く場合は、より多くのプロパティを使用して、より複雑なオブジェクトを作成できます。
src/main/java/com/example/model フォルダーを作成し、次の 2 つのファイルを追加します。
User.java:
package com.example.model;
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Greeting.java:
package com.example.model;
public class Greeting {
private String message;
public Greeting() {
}
public Greeting(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Spring Boot アプリケーションを作成する
このアプリケーションは、すべてのビジネス ロジックを管理し、Spring Boot エコシステム全体にアクセスできます。 この機能により、標準の Azure 関数に比して 2 つの主な利点が得られます。
- Azure Functions API に依存しないため、他のシステムに簡単に移植できます。 たとえば、通常の Spring Boot アプリケーションで再利用できます。
- Spring Boot からのすべての
@Enable
注釈を使用して、新しい機能を追加できます。
src/main/java/com/example フォルダーに、通常の Spring Boot アプリケーションである次のファイルを作成します。
DemoApplication.java:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoApplication.class, args);
}
}
次に、src/main/java/com/example/hello フォルダーに次のファイルを作成します。 このコードには、実行する関数を表す Spring Boot コンポーネントが含まれています。
Hello.java:
package com.example.hello;
import com.example.model.*;
import org.springframework.stereotype.Component;
import java.util.function.Function;
@Component
public class Hello implements Function<User, Greeting> {
@Override
public Greeting apply(User user) {
return new Greeting("Hello, " + user.getName() + "!\n");
}
}
手記
Hello
関数は非常に具体的です。
- それは
java.util.function.Function
です. ビジネス ロジックが含まれており、標準の Java API を使用して 1 つのオブジェクトを別のオブジェクトに変換します。 @Component
注釈があるため、Spring Bean であり、既定ではその名前はクラスと同じですが、小文字で始まります:hello
。 アプリケーションで他の関数を作成する場合は、この名前付け規則に従う必要があります。 この名前は、次のセクションで作成する Azure Functions の名前と一致する必要があります。
Azure 関数を作成する
完全な Azure Functions API を活用するために、前の手順で作成した Spring Cloud 関数にその実行を委任する Azure 関数をコーディングします。
src/main/java/com/example/hello フォルダーに、次の Azure 関数クラス ファイルを作成します。
HelloHandler.java:
package com.example.hello;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.example.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class HelloHandler {
@Autowired
private Hello hello;
@FunctionName("hello")
public HttpResponseMessage execute(
@HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request, ExecutionContext context) {
User user = request.getBody()
.filter(u -> u.getName() != null)
.orElseGet(() -> new User(request.getQueryParameters().getOrDefault("name", "world")));
context.getLogger().info("Greeting user name: " + user.getName());
return request.createResponseBuilder(HttpStatus.OK)
.body(hello.apply(user))
.header("Content-Type", "application/json")
.build();
}
}
この Java クラスは Azure 関数であり、次の興味深い機能があります。
- クラスには
@Component
注釈があるため、Spring Bean です。 @FunctionName("hello")
注釈で定義されている関数の名前はhello
。- このクラスは実際の Azure 関数を実装しているため、ここで完全な Azure Functions API を使用できます。
単体テストを追加する
この手順は省略可能ですが、アプリケーションが正しく動作することを検証することをお勧めします。
src/test/java/com/example フォルダーを作成し、次の JUnit テストを追加します。
HelloTest.java:
package com.example;
import com.example.hello.Hello;
import com.example.model.Greeting;
import com.example.model.User;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloTest {
@Test
public void test() {
Greeting result = new Hello().apply(new User("foo"));
assertThat(result.getMessage()).isEqualTo("Hello, foo!\n");
}
}
Maven を使用して Azure 関数をテストできるようになりました。
mvn clean test
関数をローカルで実行する
Azure 関数にアプリケーションをデプロイする前に、まずローカルでテストしましょう。
まず、アプリケーションを Jar ファイルにパッケージ化する必要があります。
mvn package
アプリケーションがパッケージ化されたので、azure-functions
Maven プラグインを使用してアプリケーションを実行できます。
mvn azure-functions:run
これで、ポート 7071 を使用して、azure 関数を localhost で使用できるようになります。 関数をテストするには、JSON 形式の User
オブジェクトを使用して POST 要求を送信します。 たとえば、cURL を使用すると次のようになります。
curl -X POST http://localhost:7071/api/hello -d "{\"name\":\"Azure\"}"
関数は、JSON 形式のまま、Greeting
オブジェクトを使用して回答する必要があります。
{
"message": "Hello, Azure!\n"
}
画面の上部にある cURL 要求と、下部にあるローカル Azure 関数のスクリーンショットを次に示します。
ローカルで実行されている Azure 関数を
関数をローカルでデバッグする
次のセクションでは、関数をデバッグする方法について説明します。
Intellij IDEA を使用したデバッグ
Intellij IDEA でプロジェクトを開き、アタッチする リモート JVM デバッグ 実行構成を作成します。 詳細については、「チュートリアル: リモート デバッグ」を参照してください。
を作成する
次のコマンドを使用してアプリケーションを実行します。
mvn azure-functions:run -DenableDebug
アプリケーションが起動すると、次の出力が表示されます。
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
IntelliJ IDEA でプロジェクトのデバッグを開始します。 次の出力が表示されます。
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
デバッグするブレークポイントをマークします。 Intellij IDEA は、要求の送信後にデバッグ モードになります。
Visual Studio Code を使用したデバッグ
Visual Studio Code でプロジェクトを開き、次の launch.json ファイルの内容を構成します。
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Attach to Remote Program",
"request": "attach",
"hostName": "127.0.0.1",
"port": 5005
}
]
}
次のコマンドを使用してアプリケーションを実行します。
mvn azure-functions:run -DenableDebug
アプリケーションが起動すると、次の出力が表示されます。
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
Visual Studio Code でプロジェクトのデバッグを開始し、デバッグするブレークポイントをマークします。 Visual Studio Code は、要求の送信後にデバッグ モードになります。 詳細については、「Javaの実行とデバッグ」を参照してください。
関数を Azure Functions にデプロイする
次に、Azure 関数を運用環境に発行します。 pom.xml ファイルで定義した <functionAppName>
、<functionAppRegion>
、および <functionResourceGroup>
プロパティは、関数の構成に使用されます。
手記
Maven プラグインは、Azure で認証する必要があります。 Azure CLI がインストールされている場合は、続行する前に az login
を使用してください。
その他の認証オプションについては、認証 を azure-maven-plugins リポジトリでご覧ください。
Maven を実行して関数を自動的にデプロイします。
mvn azure-functions:deploy
次に、Azure portal に移動して、作成された Function App
を見つけます。
関数を選択します。
- 関数の概要で、関数の URL をメモします。
- 実行中の関数を確認するには、ナビゲーション メニュー ログ ストリーミング を選択します。
前のセクションで行ったように、次の例に示すように、cURL を使用して実行中の関数にアクセスします。 your-function-name
を実際の関数名に置き換えてください。
curl https://your-function-name.azurewebsites.net/api/hello -d "{\"name\":\"Azure\"}"
前のセクションと同様に、関数は JSON 形式のまま、Greeting
オブジェクトで回答する必要があります。
{
"message": "Hello, Azure!\n"
}
これで、Azure Functions で Spring Cloud 関数が実行されました。 Spring Cloud 関数の詳細とサンプルについては、次のリソースを参照してください。
次の手順
Spring と Azure の詳細については、Spring on Azure ドキュメント センターに進んでください。