1. 序章

このチュートリアルでは、SpringCloudFunctionの使用方法を学習します。

シンプルなSpringCloudFunctionをローカルでビルドして実行し、AWSにデプロイします。

2. SpringCloud機能のセットアップ

まず、最初から実装し、異なるアプローチを使用して2つの機能を持つ単純なプロジェクトをテストしましょう。

  • プレーンメソッドを使用したストリングリバーサー
  • そして専用クラスを使ったグリーター

2.1. Mavenの依存関係

最初に行う必要があるのは、spring-cloud-starter-function-web依存関係を含めることです。 これはローカルアダプタとして機能し、関数をローカルで実行するために必要な依存関係をもたらします。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-function-web</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>

AWSにデプロイするときにこれを少し変更するので、しばらくお待ちください。

2.2. SpringCloud関数の記述

Spring Cloud Functionを使用すると、タイプFunction、Consumer、またはSupplierの@Beanを個別のメソッドとして公開できます

@SpringBootApplication
public class CloudFunctionApplication {

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

    @Bean
    public Function<String, String> reverseString() {
        return value -> new StringBuilder(value).reverse().toString();
    }
}

このコードのように、逆文字列機能を Function として公開できます。これは、ターゲットの機能プラットフォームが呼び出すことができます。

2.3. 逆文字列関数をローカルでテストする

spring-cloud-starter-function-web は、関数をHTTPエンドポイントとして公開します。 CloudFunctionApplication を実行した後、ターゲットをカールしてローカルでテストできます。

curl localhost:8080/reverseString -H "Content-Type: text/plain" -d "Baeldung User"

エンドポイントはBeanの名前であることに注意してください。 

そして予想通り、出力として逆の文字列を取得します。

resU gnudleaB

2.4. パッケージ内のSpringCloud関数のスキャン

私たちのメソッドを @豆、 機能的なインターフェースを実装するクラスとしてソフトウェアを作成することもできます関数

public class Greeter implements Function<String, String> {

    @Override
    public String apply(String s) {
        return "Hello " + s + ", and welcome to Spring Cloud Function!!!";
    }
}

次に、application.propertiesで関連するBeanをスキャンするパッケージを指定できます。

spring.cloud.function.scan.packages=com.baeldung.spring.cloudfunction.functions

2.5. グリーター機能をローカルでテストする

ここでも、アプリを起動し、curlを使用してGreeter関数をテストできます。

curl localhost:8080/greeter -H "Content-Type: text/plain" -d "World"

エンドポイントは、Functionalインターフェイスを実装するクラスの名前であることに注意してください。 

そして、当然のことながら、期待される挨拶が返されます。

Hello World, and welcome to Spring Cloud function!!!

3. AWSでのSpringCloud関数

Spring Cloud Functionを非常に強力なものにしているのは、クラウドに依存しないSpring対応の関数を構築できることです。 関数自体は、関数がどのように呼び出されたか、または関数がデプロイされている環境について知る必要はありません。 たとえば、ビジネスロジックを変更することなく、このグリーターをAWS、Azure、またはGoogleCloudプラットフォームに簡単にデプロイできます。

AWS Lambdaは人気のあるサーバーレスソリューションの1つであるため、アプリをAWSLambdaにデプロイする方法に焦点を当てましょう。

だから、もう待って、私たちの関数をクラウドにデプロイしましょう!

3.1. Mavenの依存関係

最初に追加したspring-cloud-starter-function-web依存関係を覚えておいてください。 それを変える時が来ました。

Spring Cloud関数を実行する場所に応じて、適切な依存関係を追加する必要があります。

AWSの場合、spring-cloud-function-adapter-awsを使用します。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-function-adapter-aws</artifactId>
</dependency>

次に、Lambdaイベントを処理するために必要なAWS依存関係を追加しましょう。

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>2.0.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.1.0</version>
    <scope>provided</scope>
</dependency>

最後に、Mavenビルドによって生成されたアーティファクトをAWS Lambdaにアップロードするため、シェーディングされたアーティファクトをビルドする必要があります。つまり、すべての依存関係がjarではなく個別のクラスファイルとして展開されます。

spring-boot-thin-layout 依存関係は、不要な依存関係を除外することにより、アーティファクトのサイズを縮小するのに役立ちます。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot.experimental</groupId>
                    <artifactId>spring-boot-thin-layout</artifactId>
                    <version>1.0.10.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <shadedClassifierName>aws</shadedClassifierName>
            </configuration>
        </plugin>
    </plugins>
</build>

3.2. AWSハンドラー

HTTPリクエストを介して文字列リバーサーを再度公開する場合、Spring CloudFunctionAWSには次のものが付属しています。 SpringBootRequestHandler。 AWSを実装しています RequestHandler AWSリクエストを私たちの関数にディスパッチすることを担当しています。

public class MyStringHandlers extends SpringBootRequestHandler<String, String> {

}

Spring Cloud Function AWSには、他の例としてSpringBootStreamHandlerおよびFunctionInvokingS3EventHandlerも同梱されています

MyStringHandlersが単なる空のクラスであるのは少し奇妙に思えるかもしれませんが、Lambda関数のエントリポイントとして機能し、その入力型と出力型を定義する上で重要な役割を果たします

以下のスクリーンショットに示されているように、AWSLambda設定ページのHandler入力フィールドにこのクラスの完全修飾名を入力します。

3.3. AWSはどのクラウド機能を呼び出すかをどのように知っていますか?

実は、アプリケーションに複数のSpring Cloud関数がある場合でも、AWSはそのうちの1つしか呼び出すことができません。

次のセクションでは、AWSコンソールのFUNCTION_NAMEという環境変数でクラウド関数名を指定します。

4. 関数をAWSにアップロードしてテストする

最後に、Mavenを使用してjarをビルドし、AWSコンソールUIを介してアップロードしましょう。

4.1. AWSコンソールでLambda関数を作成して設定します

AWS Lambdaコンソールページの[Functioncode]セクションで、 Java 8 ランタイムを選択し、Uploadをクリックするだけです。

その後、ハンドラーフィールドに、SpringBootRequestHandlerまたはcom.baeldung.spring.cloudfunction。を実装するクラスの完全修飾名を指定する必要があります。 MyStringHandlers この場合:

次に、環境変数で、FUNCTION_NAME環境変数を介して呼び出すSpring関数Beanを指定します。

それが終わったら、テストイベントを作成し、サンプル文字列を指定して、Lambda関数をテストします。

4.2. AWSでの機能のテスト

次に、テストを保存してから、テストボタンをクリックします。

そして、予想どおり、関数をローカルでテストしたときに得られたものと同じ出力が得られます。

4.3. 別の関数のテスト

このアプリケーションには、greeterというもう1つの関数があることを忘れないでください。 それも機能することを確認しましょう。

FUNCTION_NAME環境変数をgreeterに変更します。

保存ボタンをクリックし、最後にテストボタンをもう一度クリックします。

5. 結論

要約すると、初期段階ではありますが、 Spring Cloud Functionは、ビジネスロジックを特定のランタイムターゲットから切り離すための強力なツールです。

これを使用すると、同じコードをWebエンドポイントとして、クラウドプラットフォーム上で、またはストリームの一部として実行できます。 トランスポートの詳細とインフラストラクチャをすべて抽象化し、開発者が使い慣れたツールとプロセスをすべて維持し、ビジネスロジックにしっかりと集中できるようにします。

いつものように、GitHubでこのチュートリアルのソースコードを確認してください。