Spring BootのREST APIをAWS Fargateにデプロイしてみた

2021.01.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おはようございます、もきゅりんです。

皆さん、フレームワーク使ってますか?

自分は特にジャバーではないのですが、本稿ではお勉強も兼ねて Spring Boot を使って Fargate に APIをデプロイしてみました。

なお、Spring Boot に詳しいわけでは全然ないので、淡々と公式ドキュメントに沿ってAPIを作り、Dockerイメージに仕上げます。

Fargate はちゃんと動くかだけを確認しておきます。

そのため、Spring Boot および Fargate がどんなものでどんな特徴があるのか、といったコンテンツはございません。あしからず。

そういった方には下記 Fargate ブログは適切です。

基礎から応用までじっくり学ぶECS Fargateを利用したコンテナ環境構築 #Fargate | Developers.IO

やること

  1. Spring Boot でRESTful Web サービスの構築
  2. 1を Docker Imageにする
  3. Copilot で Fargate にデプロイする

前提

  1. VSCode で SpringBoot を開発できる環境がある
  2. 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 の紹介や使い方は下記ブログをご参照下さい。

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

springboot_project_start

サービスでは、 /greeting の GET リクエストを処理します。オプションで、クエリ文字列に name パラメーターを使用できるようにします。

次のような出力例になります。

{
    "id": 1,
    "content": "Hello, World!"
}

チュートリアル通り、 src/main/java/com/example/restservice/Greeting.java および src/main/java/com/example/restservice/GreetingController.java を作成します。

greeting_java

greeting_ctr_java

自動で作成された RestServiceApplication.java を選択して実行して確認します。

$ curl localhost:8080/greeting
$ curl -G -d name=Moqrin localhost:8080/greeting

api_check

問題なく動きました。counter もレスポンス時に増加しています。

ここまでで、簡単な REST API ができました。

このプロジェクトでは、Maven で JARファイルでビルドします。

./mvnw clean package

build_target

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が実行されるまで数分時間かかりましたが、問題なく表示されました。

response1

確認ができたので環境の後片付けをしておきます。

最後に

本稿の主旨ではないのですが、Copilot でのデプロイはお手軽でとても便利ですね!ナイスです。

以上です。

どなたかのお役に立てば幸いです。