ECS上に構築するSpringアプリケーション(1)一覧はこちらクラウドの普及に伴い、ますます広がりを見せつつあるサーバレス開発。本連載では、AWS上でサーバレス・アプリケーションを開発する方法について、わかりやすく解説していきます。Gateway」を使ったサーバレス環境下でSpringアプリケーションを構築する方法を解説します。Java言語及びSpringFrameworkを使った開発に従事したことがある経験者。経験がなければ、こちらのチュートリアルを実施することを推奨します。AWSアカウントを持ち、コンソール上で各サービスを実行したことがある経験者また、動作環境は以下のバージョンで実施しています。2.0.0.RC将来的には、AWSコンソール上の画面イメージや操作、バージョンアップによりJavaのソースコード内で使用するクラスが異なる可能性があります。Funtionとは通常、アプリケーション開発では、リクエストを受け付けるためのアプリケーションサーバやそれを動かすための実行マシンなどが必要になります。AWSでも、EC2やElasticBeansTalkといったサービスが提供されており、その上にアプリケーションをデプロイできますが、サーバや実行環境をほぼ意識することなく、最少限度のプログラムを用いて、アプリケーション実行環境を構築するのがサーバレス開発です。Lamdaを用いて、標準的なサーバレス開発を実現できます。Function」があります。その特徴やメリットは以下の通りです。Lambda上で実行されるサーバレスアプリケーションを実装してみましょう。実際に作成したアプリケーションはGitHub上にコミットしています。以降で記載するソースコードでは、インポート文など本質的でない記述を省略している部分があるので、実行コードを作成する場合は、必要に応じて適宜GitHubソースコードも参照してください。ここからは、次の3つのステップに分けて解説を進めていきます。Functionを使用するには、まず、Mavenプロジェクトのpom.xmlで、以下の通り、必要なライブラリの依存性を定義します。以下の4つのライブラリが必要です。Kit)として提供される、「aws-lambda-java-events」と「aws-lambda-java-core」です。これらのライブラリを用いて、サーバレス環境で実行するために必要なアプリケーションを作成します。最低限必要なクラスは、以下の3種類です。SpringBootアプリケーションとして実行するメイン実行クラスリクエストを受け取り、実行するためのHandlerクラスHandlerから受け取ったリクエストを元に実行するビジネスロジッククラスでは、それぞれのクラスの実装について解説していきましょう。Frameworkで動かすために必要となる起動クラスです。SpringAppcaliton.run()メソッドを実行するmain()メソッドを持つ実行クラスに、@SpringBootAppcalitonアノテーションを付与するだけで、SpringBootによりSpringFramework実行に必要な設定が自動実行されていきます。DB接続設定を追加するなど必要に応じてカスタマイズできますが、最低限、このクラスを作成しておくことが必要です。{}続いて必要になるのが、APIからリクエストを受け取り、イベントとしてLambda関数を実行するためのハンドラクラスです。org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandlerを継承しているだけで、上記で作成しているクラスは何も実装していませんが、それはSpringBootApiGatewayRequesthandlerが最低限の機能を実行するのに必要な処理を実装していて、それを継承することで特に追加実装する必要がないためです。ほかにも汎用的なリクエストを受け取るSpringBootRequestHandlerや、Kinesisからのイベントを契機としてリクエストを受け取るためのSpringBootKinesisEventHandlerなどがあります。Gatewayからリクエストを受け取るために必要なSpringBootApiGatewayRequesthandlerを設定しておきましょう。}最後に、実際にLambda関数として実行するためのビジネスロジッククラスです。java.util.function.Functionを実装して、org.springframework.messaging.Messageおよび、その型パラメータとして、受け取りたいJSONリクエストをモデル化したインプットクラスを指定してください。Gatewayから受け取ったJSONリクエストをPOJOクラスへ変換し、オーバーライドしたapply()メソッドを実行します。ここでは「Input」というModelクラスを作成しており、メソッドの引数としてそのオブジェクトを受け取り、そのオブジェクトのパラメータであるString型の「test」という変数の値をログ出力しています。処理実行後は単なるString型の文字列「”Complete!”」をJSONレスポンスとして返すような形で実装するサンプルです。実案件のアプリケーション開発では、こうした単純なロジックだけではなく、インプットデータをDynamoDBなどに追加する処理ロジックなど追加する要件などが出てきますが、Springベースのアプリケーションで構築していれば、データベースアクセス用のRepositoryクラスをDIインジェクションするだけで簡単にデータ投入のロジックを実装できます。AWS※などのフレームワークを組み合わせれば良いでしょう。関数型のクラスは、1で実装したアプリケーションクラス内で直接@Beanアノテーションで定義しておくか、以下のように「application.yml」のような設定ファイルで、spring.cloud.function.scan.packagesプロパティにコンポーネントスキャンするパッケージを指定しておけば、自動でSpringBootが読み取ってくれます。Lambdaへこの実行クラスをJAR形式にしてアップロードしてデプロイします。Lambdaへアップロードするには、これまで作成した3つのクラスに加えて、実行に必要な全ての依存JARライブラリを1つにまとめてアップロードする必要があります。そのためにpom.xmlに以下の定義も合わせて追加するようにしてください。maven-shade-pluginの定義等を追加しておけば、Mavenのビルド時に必要なJARファイルを全て含めた形で1つのJAR形式のファイルを作成できます。packageコマンドを実行すると、プロジェクト名に下記のshareClassifierNameタグに定義した名称が付与された、全てのJARファイルを包含した大きめのサイズのJARファイルがtargetディレクトリ上に出来上がるはずです。</plugins></build>JARファイル形式で、アプリケーションが作成できれば完成です。Lambdaへ設定してみます。Kohei)某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。Professionalなどの資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。