Spring BootのREST APIをAWS Fargateにデプロイしてみた
はじめに
おはようございます、もきゅりんです。
皆さん、フレームワーク使ってますか?
自分は特にジャバーではないのですが、本稿ではお勉強も兼ねて Spring Boot を使って Fargate に APIをデプロイしてみました。
なお、Spring Boot に詳しいわけでは全然ないので、淡々と公式ドキュメントに沿ってAPIを作り、Dockerイメージに仕上げます。
Fargate はちゃんと動くかだけを確認しておきます。
そのため、Spring Boot および Fargate がどんなものでどんな特徴があるのか、といったコンテンツはございません。あしからず。
そういった方には下記 Fargate ブログは適切です。
基礎から応用までじっくり学ぶECS Fargateを利用したコンテナ環境構築 #Fargate | Developers.IO
やること
- Spring Boot でRESTful Web サービスの構築
- 1を Docker Imageにする
- Copilot で Fargate にデプロイする
前提
- VSCode で SpringBoot を開発できる環境がある
- Copilot が使える環境
1 VSCodeでSpringBootを開発できる環境がある
環境は Spring Boot 入門 - リファレンスドキュメント に沿って準備していきます。
下記が今回の環境です。
$ java --version java 15.0.2 2021-01-19 Java(TM) SE Runtime Environment (build 15.0.2+7-27) Java HotSpot(TM) 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
$ spring --version Spring CLI v2.4.2
VSCodeでの開発環境は 【簡単】VSCode+Spring Bootアプリケーション開発手順 を参考にさせて貰いました。ありがとうございます。
2 Copilotが使える環境
Copilot の紹介や使い方は下記ブログをご参照下さい。
- Amazon ECSの新たなデプロイツールとなるAWS CopilotがGAに!ECS環境の構築が便利になるぞ!! | Developers.IO
- AWS Copilot でAWS Fargateに簡単デプロイしてみよう | Developers.IO
1 RESTful Web サービスの構築
SpringBoot の REST API を Fargate でデプロイする、が本稿の主題となるため、コード詳細が気になる方は Spring Boot RESTful Web サービスの構築 - 公式サンプルコード をご参照下さい。
Spring Initializr で開始する or VSCodeで開始します。
以下内容でプロジェクトを作成しています。
- Spring Boot version: 2.4.2
- project language: Java
- Group Id: com.example
- Artifact Id: rest-service
- packaging type: JAR
- Java version: 15
- dependencies: Spring Web
サービスでは、 /greeting
の GET リクエストを処理します。オプションで、クエリ文字列に name パラメーターを使用できるようにします。
次のような出力例になります。
{ "id": 1, "content": "Hello, World!" }
チュートリアル通り、 src/main/java/com/example/restservice/Greeting.java
および src/main/java/com/example/restservice/GreetingController.java
を作成します。
自動で作成された RestServiceApplication.java
を選択して実行して確認します。
$ curl localhost:8080/greeting $ curl -G -d name=Moqrin localhost:8080/greeting
問題なく動きました。counter もレスポンス時に増加しています。
ここまでで、簡単な REST API ができました。
このプロジェクトでは、Maven で JARファイルでビルドします。
./mvnw clean package
target ディレクトリ以下に JAR ファイルが作成されました。
2 Spring Boot をDocker Imageにする
次は、 Docker で Spring Boot - 公式サンプルコード を参考にイメージ化します。
Dockerfile をプロジェクトディレクトリ内で作成します。
target ディレクトリ以下のJARファイルを Docker Imageにコピーして、コンテナ起動時にJAR ファイルを実行します。
FROM openjdk:15-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
Image をビルドして実行してみます。
docker build -t demo-spring-api . docker run -p 8080:8080 demo-spring-api docker stop
確認できたらコンテナ削除します。
3 Copilot で Fargate にデプロイする
Dockerfile まで作成できれば後はもういつもの通りなのですが、いちおうちゃんと機能するかだけ確認しておきたいので、 Copilot を使ってちゃちゃっとデプロイします。
使い方は AWS Copilot でAWS Fargateに簡単デプロイしてみよう | Developers.IO をご参照下さい。
念のため補足しておくと、ターゲットグループにルーティングするポートは80ではなく、8080です。
Service name: sample-spring-api Dockerfile: ./Dockerfile no EXPOSE statements in Dockerfile ./Dockerfile Which port do you want customer traffic sent to? [? for help] (80) 8080
デプロイまで10~15分くらい待ちます。
✔ Deployed sample-spring-api, you can access it at http://demo-Publi-xxxxxxx-xxxxxxx.region.elb.amazonaws.com.
表示されたFQDNにアクセスします。
デプロイ完了してから、APIが実行されるまで数分時間かかりましたが、問題なく表示されました。
確認ができたので環境の後片付けをしておきます。
最後に
本稿の主旨ではないのですが、Copilot でのデプロイはお手軽でとても便利ですね!ナイスです。
以上です。
どなたかのお役に立てば幸いです。