Azure での Spring Cloud Function の概要Getting started with Spring Cloud Function in Azure

この記事では、Spring Cloud Function を使用して Java 関数を開発し、それを Azure Functions に発行する手順について説明します。This article guides you through using Spring Cloud Functions to develop a Java function and publish it to Azure Functions. 完了すると、関数コードは Azure の従量課金プランで実行され、HTTP 要求を使用してトリガーできるようになります。When you're done, your function code runs on the Consumption Plan in Azure and can be triggered using an HTTP request.

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

前提条件Prerequisites

Java を使用して関数を開発するには、以下のものがインストールされている必要があります。To develop functions using Java, you must have the following installed:

重要

このクイックスタートを行うには、JAVA_HOME 環境変数を JDK のインストール場所に設定する必要があります。The JAVA_HOME environment variable must be set to the install location of the JDK to complete this quickstart.

ビルドするものWhat we are going to build

Azure Functions 上で実行される古典的な "Hello, World" 関数をビルドします。これは、Spring Cloud Function を使用して構成されます。We are going to build a classical "Hello, World" function, that runs on Azure Functions, and which is configured with Spring Cloud Function.

これは、ユーザー名が含まれているシンプルな User JSON オブジェクトを受け取り、そのユーザーへのウェルカム メッセージが含まれている Greeting オブジェクトを返します。It will receive a simple User JSON object, which contains a user name, and sends back a Greeting object, which contains the welcome message to that user.

ここでビルドするプロジェクトは https://github.com/Azure-Samples/hello-spring-function-azure で入手できるため、このクイックスタートで詳しく説明されている完成形を確認したい場合は、そのサンプル リポジトリを直接使用することができます。The project we build here is available on https://github.com/Azure-Samples/hello-spring-function-azure, so you can use that sample repository directly if you want to see the final work that is detailed in this quickstart.

新しい Maven プロジェクトを作成するCreate a new Maven project

空の Maven プロジェクトを作成し、Spring Cloud Function と Azure Functions を使用してそれを構成します。We are going to create an empty Maven project, and configure it with Spring Cloud Function and Azure Functions.

空のフォルダーに新しい pom.xml を作成し、https://github.com/Azure-Samples/hello-spring-function-azure/blob/master/pom.xml にあるサンプル プロジェクトの内容をコピーして貼り付けます。In an empty folder, create a new pom.xml and copy/paste the content from our sample project at https://github.com/Azure-Samples/hello-spring-function-azure/blob/master/pom.xml.

注意

このファイルでは、Spring Boot と Spring Cloud Function 両方の Maven 依存関係を使用し、Spring Boot と Azure Functions の Maven プラグインを構成します。This file uses Maven dependencies from both Spring Boot and Spring Cloud Function, and it configures the Spring Boot and Azure Functions Maven plugins.

いくつかのプロパティは、自分のアプリケーションに合わせてカスタマイズする必要があります。A few properties need to be customized for your application:

  • <functionAppName> は、自分の Azure 関数の名前です<functionAppName> is the name of your Azure Function
  • <functionAppRegion> は、自分の関数がデプロイされる Azure リージョンの名前です<functionAppRegion> is the name of the Azure region where your Function is deployed
  • <functionResourceGroup> は、自分が使用している Azure リソース グループの名前です<functionResourceGroup> is the name of the Azure resource group you are using

これらのプロパティは、pom.xml ファイルの先頭付近で直接変更する必要があります。You should change those properties directly near the top of the pom.xml file:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <azure.functions.maven.plugin.version>1.3.2</azure.functions.maven.plugin.version>
    <azure.functions.java.library.version>1.3.0</azure.functions.java.library.version>
    <functionAppName>my-spring-function</functionAppName>
    <functionAppRegion>westus</functionAppRegion>
    <stagingDirectory>${project.build.directory}/azure-functions/${functionAppName}</stagingDirectory>
    <functionResourceGroup>my-resource-group</functionResourceGroup>
    <start-class>com.example.HelloFunction</start-class>
    <wrapper.version>1.0.22.RELEASE</wrapper.version>
</properties>

Azure 構成ファイルを作成するCreate Azure configuration files

src/main/azure フォルダーを作成し、それに次の Azure Functions 構成ファイルを追加します。Create a src/main/azure folder and add the following Azure Functions configuration files to it.

host.json:host.json:

{
  "version": "2.0",
  "functionTimeout": "00:10:00"
}

local.settings.json:local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "AzureWebJobsDashboard": ""
  }
}

ドメイン オブジェクトを作成するCreate domain objects

Azure Functions では、JSON 形式のオブジェクトを送受信できます。Azure Functions can receive and send objects in JSON format. ここでは、ドメイン モデルを表す User オブジェクトと Greeting オブジェクトを作成します。We are now going to create our User and Greeting objects, which represent our domain model. このクイックスタートをカスタマイズして、もっと自分の関心に沿ったものにしたい場合は、さらに多くのプロパティを備えた、より複雑なオブジェクトを作成できます。You can create more complex objects, with more properties, if you want to customize this quickstart and make it more interesting for you.

src/main/java/com/example/model フォルダーを作成して、次の 2 つのファイルを追加します。Create a src/main/java/com/example/model folder and add the following two files:

User.java:User.java:

package com.example.model;

public class User {

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Greeting.java:Greeting.java:

package com.example.model;

public class Greeting {

    public Greeting() {
    }

    public Greeting(String message) {
        this.message = message;
    }

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Spring Boot アプリケーションを作成するCreate the Spring Boot application

このアプリケーションは、すべてのビジネス ロジックを管理し、Spring Boot エコシステム全体へのアクセス権を備えたものとなります。This application will manage all business logic, and will have access to the full Spring Boot ecosystem. このため、標準の Azure 関数に比べて、2 つの主なメリットがあります。This gives you therefore two main benefits over a standard Azure Function:

  • これは Azure Functions API に依存していないため、他のシステムに簡単に移植できます。It doesn't rely on the Azure Functions APIs, so it can easily be ported to other systems. たとえば、通常の Spring Boot アプリケーションで再利用することもできます。For example, it could be reused in a normal Spring Boot application.
  • Spring Boot のすべての @Enable 注釈を使用して、新しい強力な機能を簡単に追加できます。It can use all the @Enable annotations from Spring Boot to easily add powerful new features.

src/main/java/com/example フォルダーで次のファイルを作成します。これは通常の Spring Boot アプリケーションです。In the src/main/java/com/example folder, create the following file, which is a normal Spring Boot application:

HelloFunction.java:HelloFunction.java:

package com.example;

import com.example.model.Greeting;
import com.example.model.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.util.function.Function;

@SpringBootApplication
public class HelloFunction {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(HelloFunction.class, args);
    }

    @Bean
    public Function<User, Greeting> hello() {
        return user -> new Greeting("Welcome, " + user.getName());
    }
}

注意

hello() は、非常に具体的な関数です。The hello() function is quite specific:

  • これは、このクイックスタートで使用される関数である java.util.function.Function を返します。It returns a java.util.function.Function, which is the function that will be used in this quickstart. これにはビジネス ロジックが含まれており、標準の Java API を使用して、あるオブジェクトを別のオブジェクトに変換します。It contains the business logic, and is uses a standard Java API to transform one object into another.
  • これは @Bean 注釈を備えているため、Spring Bean です。既定では、メソッドのいずれか (hello) がその名前になっています。As it has the @Bean annotation, it is a Spring Bean, and by default its name is the one of the method, hello. これは自分のアプリケーションに他の関数を作成したい場合に重要です。この名前が、次のセクションで作成する Azure 関数の名前と一致する必要があるためです。This is important if you want to create other functions in your application, as this name must match the Azure Functions name we will create in the next section.

Azure 関数を作成するCreate the Azure Function

完全な Azure Functions API のメリットを得るために、次は特定のクラスのコードを書きます。これは、その実行を前の手順で作成した Spring Coud 関数に委任する Azure 関数です。In order to benefit from the full Azure Functions API, we are now going to code a specific class: it is an Azure Function that will delegate its execution to the Spring Cloud Function we have created in the previous step.

src/main/java/com/example フォルダーで、次の Azure 関数を作成します。In the src/main/java/com/example folder, create the following Azure Function:

HelloHandler.java:HelloHandler.java:

package com.example;

import com.example.model.Greeting;
import com.example.model.User;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHandler;

import java.util.Optional;

public class HelloHandler extends AzureSpringBootRequestHandler<User, Greeting> {

    @FunctionName("hello")
    public Greeting execute(
            @HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request,
            ExecutionContext context) {

        context.getLogger().info("Greeting user name: " + request.getBody().get().getName());
        return handleRequest(request.getBody().get(), context);
    }
}

この Java クラスは Azure 関数であり、次のような興味深い機能を備えています。This Java class is an Azure Function, with the following interesting features:

  • これによって、AzureSpringBootRequestHandler が拡張され、Azure Functions と Spring Cloud Function のリンクが行われます。It extends AzureSpringBootRequestHandler, which does the link between Azure Functions and Spring Cloud Function. これは、execute() メソッドで使用される handleRequest() メソッドを提供します。This is what provides the handleRequest() method that is used in its execute() method.
  • 関数の名前は、@FunctionName("hello") 注釈で定義されているように、前の手順で構成した Spring Bean (hello) と同じです。The name of the function, as defined by the @FunctionName("hello") annotation, is the same as the Spring bean we have configured in the previous step, hello.
  • これは本物の Azure 関数であるため、ここでは完全な Azure Functions API を使用できます。It is a real Azure Function, so you can use the full Azure Functions API here.

単体テストを追加するAdd unit tests

当然、この手順は省略可能です。しかし、優れた開発者として、アプリケーションが正常に機能することを検証するための単体テストを追加することが推奨されます。Of course, this step is optional, but as good developers you should add unit tests to validate that the application works correctly.

src/test/java/com/example フォルダーを作成し、次の JUnit テストを追加します。Create a src/test/java/com/example folder, and add the following JUnit tests:

HelloFunctionTest.java:HelloFunctionTest.java:

package com.example;

import com.example.model.Greeting;
import com.example.model.User;
import org.junit.Test;
import org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHandler;

import static org.assertj.core.api.Assertions.assertThat;

public class HelloFunctionTest {

    @Test
    public void test() {
        Greeting result = new HelloFunction().hello().apply(new User("foo"));
        assertThat(result.getMessage()).isEqualTo("Welcome, foo");
    }

    @Test
    public void start() throws Exception {
        AzureSpringBootRequestHandler<User, Greeting> handler = new AzureSpringBootRequestHandler<>(
                HelloFunction.class);
        Greeting result = handler.handleRequest(new User("foo"), null);
        handler.close();
        assertThat(result.getMessage()).isEqualTo("Welcome, foo");
    }
}

ここで、Maven を使用して自分の Azure 関数をテストできます。You can now test your Azure Function using Maven:

mvn clean test

関数をローカルで実行するRun the Function locally

自分のアプリケーションを Azure 関数にデプロイする前に、まずはそれをローカルでテストしてみましょう。Before you deploy your application to Azure Function, let's first test it locally.

最初に、自分のアプリケーションを Jar ファイルにパッケージ化する必要があります。First you need to package your application into a Jar file:

mvn package

アプリケーションがパッケージ化されたら、azure-functions Maven プラグインを使用してそれを実行できます。Now that the application is packaged, you can run it using the azure-functions Maven plugin:

mvn azure-functions:run

Azure 関数は、ポート 7071 を使って自分の localhost で使用できるようになっているはずです。The Azure Function should now be available on your localhost, using port 7071. JSON 形式の User オブジェクトが含まれた POST 要求を送信して、関数をテストできます。You can test the function by sending it a POST request, with a User object in JSON format. たとえば、cURL を使用した場合:For example, using cURL:

curl http://localhost:7071/api/hello -d "{\"name\":\"Azure\"}"

関数は JSON 形式のままで Greeting オブジェクトを返すはずです。The Function should answer you with a Greeting object, still in JSON format:

{
  "message": "Welcome, Azure"
}

次に示すのは、画面の上部に cURL 要求があり、下部にローカルの Azure 関数があるスクリーンショットです。Here is a screenshot of the cURL request on the top of the screen, and the local Azure Function at the bottom:

ローカルで実行中の Azure 関数

関数を Azure Functions にデプロイするDeploy the Function to Azure Functions

次に、Azure 関数を運用環境に発行します。Now you are going to publish the Azure Function to production. pom.xml で自分が定義した <functionAppName><functionAppRegion><functionResourceGroup> の各プロパティは、自分の関数を構成するために使用されることを覚えておいてください。Remember that the <functionAppName>, <functionAppRegion> and <functionResourceGroup> properties you have defined in your pom.xml will be used to configure your function.

Maven を実行して自分の関数を自動でデプロイします。Run Maven to deploy your function automatically:

mvn azure-functions:deploy

次に Azure portal に移動して、作成された Function App を見つけます。Now go to the Azure portal to find the Function App that has been created.

関数をクリックします。Click on the function:

  • 関数の概要で、関数の URL をメモします。In the function overview, note the function's URL.
  • [プラットフォーム機能] タブを選択してログ ストリーミング サービスを見つけます。次に、そのサービスを選択して、自分が実行している関数を確認します。Select the Platform features tab to find the Log streaming service, then select this service to check your running function.

ここで、前のセクションで行ったように cURL を使用して、実行中の関数にアクセスします。Now, as you did in the previous section, use cURL to access the running function. your-function-name は実際の関数名に置き換えてください。Please replace your-function-name by your real function name:

curl https:/your-function-name.azurewebsites.net/api/hello -d "{\"name\":\"Azure\"}"

前のセクションと同様に、関数は JSON 形式のままで Greeting オブジェクトを返すはずです。Like in the previous section, the Function should answer you with a Greeting object, still in JSON format:

{
  "message": "Welcome, Azure"
}

おめでとうございます。Azure Functions 上で実行される Spring Cloud 関数ができました。Congratulations, you have a Spring Cloud Function running on Azure Functions!