Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS Serverless Java Container, 
Spring Bootで試してみた / javado22

AWS Serverless Java Container, 
Spring Bootで試してみた / javado22

「ハイブリット開催!Javaもそれ以外も幅広く聞きたい・話したい!」にて登壇
https://javado.connpass.com/event/270973/

Hiroto YAMAKAWA

January 28, 2023
Tweet

More Decks by Hiroto YAMAKAWA

Other Decks in Programming

Transcript

  1. XRMTG 2 公立千歳科学技術大学 情報システム工学科 専任講師 
 R&D: Experimental Development of ICT

    Services, Learning Technology, 
 Computer in Education, Programming & Programmer's Education Hiroto YAMAKAWA 千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発 大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)
  2. #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使ってる勢にとっては 
 今更のネタなのかもしれない
  3. #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がある
  4. #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)に 
 しておく
  5. #javado 作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる Application.java Quick Startを動かしてみる 7 AWS

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

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

    AWS Lambaの要求/返答と 
 Spring Boot(Servlet)の 
 要求/返答をプロキシする 
 ハンドラ このクラスを用意することで、 
 既存のプロジェクトも 
 AWS Serverless Container 
 で動作させることができる HTTP2を使ったり、 
 Lambdaの10秒起動ルールに 
 間に合わない場合は 
 ビルダーを切り替える 
 (この資料では割愛した部分)
  8. #javado Quick Startを動かしてみる 10 AWS SAM CLI で build &

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

    deploy 無事に配置された! ※sam sync でもっと簡単にできますが、 
   この記事ではマニュアル準拠で 
   実行しています
  10. #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