Slide 1

Slide 1 text

#javado AWS Serverless Java Container, 
 Spring Bootで試してみた 山川広人(@gishi_yama) 1

Slide 2

Slide 2 text

XRMTG 2 公立千歳科学技術大学 情報システム工学科 専任講師 
 R&D: Experimental Development of ICT Services, Learning Technology, 
 Computer in Education, Programming & Programmer's Education Hiroto YAMAKAWA 千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発 大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)

Slide 3

Slide 3 text

#javado What is the 
 "AWS Serverless Java container" 3

Slide 4

Slide 4 text

#javado https://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 Container 4 注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=1434 SpringとかLambdaで動かない の?という話題は2016年ぐらい からあった注2中で開発が始まり、 
 日本でもAWS Summit Tokyo 2017で紹介されていた注3 なので、もしかしたら 
 AWSでバリバリJava使ってる勢にとっては 
 今更のネタなのかもしれない

Slide 5

Slide 5 text

#javado 事前にMaven(or Gradle)、AWS CLI、AWS SAM CLIが必要なのでインストールしておく 
 参考: https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2 Quick Startを動かしてみる 5 ※後述の場所で SAM CLI は Gradle を優先して動作させるようなので、  Maven or Gradle によって、pom.xml or build.gradle の 
  どちらかを残すように削除しておいた方がよい ビルドしたプロジェクトは 
 AWS CloudFormation経由で配置されるので、 
 template.ymlがある

Slide 6

Slide 6 text

#javado 作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる pom.xml Quick Startを動かしてみる 6 今回話題の 
 AWS Serverless Java Container 
 がライブラリとして読み込まれている 
 (2022年12月現在、1.9.1が最新) 作成直後は 1.8 (Java 8) なので、 
 Lambdaが対応している 
 最新版のJDKとなる 11 (Java 11)に 
 しておく

Slide 7

Slide 7 text

#javado 作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる Application.java Quick Startを動かしてみる 7 AWS Lambdaのコールドスタートの 
 速度を向上させるために、@Import 
 でインジェクションするクラスを 
 明示的に指定している パッケージごとインジェクションするなら 
 @ComponentScan

Slide 8

Slide 8 text

#javado 作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる PingController.java Quick Startを動かしてみる 8 ノーマルな @RestController デフォルトは Hello World なのでデモ用にちょっと変更 
 (テストコードのStreamLambdaHandlerTest:L52もコメントアウトする)

Slide 9

Slide 9 text

#javado 作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる StreamReaderHandler.java (コメントアウト割愛) Quick Startを動かしてみる 9 AWS Lambaの要求/返答と 
 Spring Boot(Servlet)の 
 要求/返答をプロキシする 
 ハンドラ このクラスを用意することで、 
 既存のプロジェクトも 
 AWS Serverless Container 
 で動作させることができる HTTP2を使ったり、 
 Lambdaの10秒起動ルールに 
 間に合わない場合は 
 ビルダーを切り替える 
 (この資料では割愛した部分)

Slide 10

Slide 10 text

#javado Quick Startを動かしてみる 10 AWS SAM CLI で build & deploy .aws-sam の中に 
 プロジェクトがビルドされる ※sam sync でもっと簡単にできますが、 
   この記事ではマニュアル準拠で 
   実行しています

Slide 11

Slide 11 text

#javado Quick Startを動かしてみる 11 AWS SAM CLI で build & deploy 無事に配置された! ※sam sync でもっと簡単にできますが、 
   この記事ではマニュアル準拠で 
   実行しています

Slide 12

Slide 12 text

#javado Quick Startを動かしてみる 12 動作確認(jqコマンドが別途インストールされているとします) 無事にJSONが取れた! 廃棄するときは...

Slide 13

Slide 13 text

#javado AWS Lambdaでフレームワークが動いて何がうれしい? →フレームワークの機能やライブラリ等を使える Springの機能やライブラリもちゃんと使える 13 キャッシュした値を使えるようにしてみる(変更点のみ記載) 5秒ごとにキャッシュクリア 実行結果をキャッシュ

Slide 14

Slide 14 text

#javado Springの機能やライブラリもちゃんと使える 14 キャッシュした値を使えるようにしてみる(変更点のみ記載) キャッシュとそのクリアが 
 効いている

Slide 15

Slide 15 text

#javado AWS 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