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. #javado
    AWS Serverless Java Container,

    Spring Bootで試してみた
    山川広人(@gishi_yama)
    1

    View Slide

  2. XRMTG 2
    公立千歳科学技術大学 情報システム工学科 専任講師

    R&D: Experimental Development of ICT Services, Learning Technology,

    Computer in Education, Programming & Programmer's Education
    Hiroto YAMAKAWA
    千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発
    大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)

    View Slide

  3. #javado
    What is the

    "AWS Serverless Java container"
    3

    View Slide

  4. #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使ってる勢にとっては

    今更のネタなのかもしれない

    View Slide

  5. #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がある

    View Slide

  6. #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)に

    しておく

    View Slide

  7. #javado
    作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる


    Application.java
    Quick Startを動かしてみる
    7
    AWS Lambdaのコールドスタートの

    速度を向上させるために、@Import

    でインジェクションするクラスを

    明示的に指定している


    パッケージごとインジェクションするなら

    @ComponentScan

    View Slide

  8. #javado
    作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる


    PingController.java
    Quick Startを動かしてみる
    8
    ノーマルな @RestController


    デフォルトは Hello World なのでデモ用にちょっと変更

    (テストコードのStreamLambdaHandlerTest:L52もコメントアウトする)

    View Slide

  9. #javado
    作成された my-service をIDE(IntelliJ IDEAなど)で読み込んで、ソースコードを見てみる


    StreamReaderHandler.java (コメントアウト割愛)
    Quick Startを動かしてみる
    9
    AWS Lambaの要求/返答と

    Spring Boot(Servlet)の

    要求/返答をプロキシする

    ハンドラ
    このクラスを用意することで、

    既存のプロジェクトも

    AWS Serverless Container

    で動作させることができる
    HTTP2を使ったり、

    Lambdaの10秒起動ルールに

    間に合わない場合は

    ビルダーを切り替える

    (この資料では割愛した部分)

    View Slide

  10. #javado
    Quick Startを動かしてみる
    10
    AWS SAM CLI で build & deploy
    .aws-sam の中に

    プロジェクトがビルドされる
    ※sam sync でもっと簡単にできますが、

      この記事ではマニュアル準拠で

      実行しています

    View Slide

  11. #javado
    Quick Startを動かしてみる
    11
    AWS SAM CLI で build & deploy
    無事に配置された!
    ※sam sync でもっと簡単にできますが、

      この記事ではマニュアル準拠で

      実行しています

    View Slide

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

    View Slide

  13. #javado
    AWS Lambdaでフレームワークが動いて何がうれしい?


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

    View Slide

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

    効いている

    View Slide

  15. #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

    View Slide