「ハイブリット開催!Javaもそれ以外も幅広く聞きたい・話したい!」にて登壇 https://javado.connpass.com/event/270973/
#javadoAWS Serverless Java Container, Spring Bootで試してみた山川広人(@gishi_yama)1
View Slide
XRMTG 2公立千歳科学技術大学 情報システム工学科 専任講師 R&D: Experimental Development of ICT Services, Learning Technology, Computer in Education, Programming & Programmer's EducationHiroto YAMAKAWA千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)
#javadoWhat is the "AWS Serverless Java container"3
#javadohttps://github.com/awslabs/aws-serverless-java-container/wiki によると...Spring BootフレームワークのJavaアプリケーションを API Gateway (or Application Load Balancer)と 連携する形でAWS Lambda で簡単に実行するライブラリ 他にもSpring単体, Jersey, Struts2注1, Sparkに対応しているサーブレットコンテナの代わりにフレームワークを起動して、 クライアントからの要求(API Gateway プロキシイベント)は HttpServletRequest などに変換してフレームワークに渡すフレームワークからの返答(レスポンス)は API Gatewayが扱えるLamdaの戻り値相当に変換して返す AWS Serverless Java Container4注1 Struts2 !?と思ったけど、2018年時点でサイズやメモリ消費量はSpringBootよりもちょっといいぞ!という記事もある https://www.jgeppert.com/2018/05/serverless-aws-lambda-performance-of-apache-struts2-vs-spring-boot/注2 https://apiexplorer.wordpress.com/2016/03/11/creating-aws-lambda-using-java-and-spring-framework/注3 https://youtu.be/aiH8Z7MGGL0?t=1434SpringとかLambdaで動かないの?という話題は2016年ぐらいからあった注2中で開発が始まり、 日本でもAWS Summit Tokyo2017で紹介されていた注3なので、もしかしたら AWSでバリバリJava使ってる勢にとっては 今更のネタなのかもしれない
#javado事前にMaven(or Gradle)、AWS CLI、AWS SAM CLIが必要なのでインストールしておく 参考: https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2Quick Startを動かしてみる5※後述の場所で SAM CLI は Gradle を優先して動作させるようなので、 Maven or Gradle によって、pom.xml or build.gradle の どちらかを残すように削除しておいた方がよいビルドしたプロジェクトは AWS CloudFormation経由で配置されるので、 template.ymlがある
#javado作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみるpom.xmlQuick Startを動かしてみる6今回話題の AWS Serverless Java Container がライブラリとして読み込まれている (2022年12月現在、1.9.1が最新)作成直後は 1.8 (Java 8) なので、 Lambdaが対応している 最新版のJDKとなる 11 (Java 11)に しておく
#javado作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみるApplication.javaQuick Startを動かしてみる7AWS Lambdaのコールドスタートの 速度を向上させるために、@Import でインジェクションするクラスを 明示的に指定しているパッケージごとインジェクションするなら @ComponentScan
#javado作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみるPingController.javaQuick Startを動かしてみる8ノーマルな @RestControllerデフォルトは Hello World なのでデモ用にちょっと変更 (テストコードのStreamLambdaHandlerTest:L52もコメントアウトする)
#javado作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみるStreamReaderHandler.java (コメントアウト割愛)Quick Startを動かしてみる9AWS Lambaの要求/返答と Spring Boot(Servlet)の 要求/返答をプロキシする ハンドラこのクラスを用意することで、 既存のプロジェクトも AWS Serverless Container で動作させることができるHTTP2を使ったり、 Lambdaの10秒起動ルールに 間に合わない場合は ビルダーを切り替える (この資料では割愛した部分)
#javadoQuick Startを動かしてみる10AWS SAM CLI で build & deploy.aws-sam の中に プロジェクトがビルドされる※sam sync でもっと簡単にできますが、 この記事ではマニュアル準拠で 実行しています
#javadoQuick Startを動かしてみる11AWS SAM CLI で build & deploy無事に配置された!※sam sync でもっと簡単にできますが、 この記事ではマニュアル準拠で 実行しています
#javadoQuick Startを動かしてみる12動作確認(jqコマンドが別途インストールされているとします)無事にJSONが取れた!廃棄するときは...
#javadoAWS Lambdaでフレームワークが動いて何がうれしい?→フレームワークの機能やライブラリ等を使えるSpringの機能やライブラリもちゃんと使える13キャッシュした値を使えるようにしてみる(変更点のみ記載)5秒ごとにキャッシュクリア実行結果をキャッシュ
#javadoSpringの機能やライブラリもちゃんと使える14キャッシュした値を使えるようにしてみる(変更点のみ記載)キャッシュとそのクリアが 効いている
#javadoAWS Serverless Java Container は、 AWS Lambda & AWS API Gateway にJavaのフレームワークベースで作成したアプリを 簡単に配置できるライブラリSpring Boot用のQuick Startを動かしてみることで、動作や内容を簡単に確認できる ⇒ 中身も非常にシンプルで、理解しやすいAWS Serverless Java Container を使うことで、 普段使い慣れたフレームワークの機能やライブラリを使って、AWS Lambda 関数を準備できる既存のプロジェクトに組み込んでServerless Java Containerとして動かせるようにしたり、Spring Bootの場合、Spring Security(ただし、Sessionはステートレスのみ)やWebFluxとの連携などもできるようだが、まだ試せてない...まとめ15