Spring Cloud機能を利用したサーバーレス機能

Spring Cloud Functionを使用したサーバーレス機能

1. 前書き

このチュートリアルでは、Spring Cloud Functionの使用方法を学びます。

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

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

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

  • プレーンメソッドを使用した文字列リバース

  • そして、専用のクラスを使用した挨拶

2.1. Mavenの依存関係

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


    org.springframework.cloud
    spring-cloud-starter-function-web
    1.0.1.RELEASE

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

2.2. SpringCloud関数の記述

Spring Cloud関数を使用すると、we can expose @Beans of type FunctionConsumer or Supplier as individual methods

@SpringBootApplication
public class CloudFunctionApplication {

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

    @Bean
    public Function 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 "example User"

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

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

resU gnudleaB

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

メソッドを@Bean, として公開する以外に、関数型インターフェースFunction<T, R>を実装するクラスとしてソフトウェアを作成することもできます。

public class Greeter implements Function {

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

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

spring.cloud.function.scan.packages=com.example.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対応の機能を構築できることです。 関数自体は、関数がどのように呼び出されたか、または関数がデプロイされている環境について知る必要はありません。 たとえば、we can easily deploy this greeter to AWS, Azure or Google Cloud platform without changing any of the business logic.

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

それでは、もう待たずに、関数をクラウドにデプロイしましょう。

3.1. Mavenの依存関係

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

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

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


    org.springframework.cloud
    spring-cloud-function-adapter-aws

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


    com.amazonaws
    aws-lambda-java-events
    2.0.2
    provided


    com.amazonaws
    aws-lambda-java-core
    1.1.0
    provided

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

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


    
        
            org.apache.maven.plugins
            maven-deploy-plugin
            
                true
            
        
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                
                    org.springframework.boot.experimental
                    spring-boot-thin-layout
                    1.0.10.RELEASE
                
            
        
        
            org.apache.maven.plugins
            maven-shade-plugin
            
                false
                true
                aws
            
        
    

3.2. AWSハンドラー

HTTPリクエストを介して文字列リバーサーを再度公開する場合、Spring Cloud Function AWSにはSpringBootRequestHandler.が付属しています。これはAWSのRequestHandlerを実装し、AWSリクエストを関数にディスパッチする役割を果たします。

public class MyStringHandlers extends SpringBootRequestHandler {

}

Spring Cloud Function AWSには、他の例としてSpringBootStreamHandlerFunctionInvokingS3EventHandlerも同梱されています

Now, it may seem a bit odd that the MyStringHandlers is just an empty class but it plays an important roleは、Lambda関数のエントリポイントとして機能し、その入力タイプと出力タイプを定義します。

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

3.3. AWSは、呼び出すクラウド関数をどのように認識していますか?

結局のところ、アプリケーションに複数のSpring Cloud関数がある場合でも、AWS can invoke only one of them.

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

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

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

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

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

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

image

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

image

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

image

4.2. AWSでの機能のテスト

ここで、Saveのテストを行い、Testボタンをクリックします。

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

image

4.3. 別の機能のテスト

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

FUNCTION_NAME environment変数をgreeterに変更します。

image

Saveボタンをクリックし、最後にもう一度Testボタンをクリックします。

image

5. 結論

要約すると、初期段階ではありますが、Spring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target.

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

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