Spring Boot アプリケーションをお手軽に本番運用

AWS App Runner と AWS CDK の活用 ~ 第一回

2023-03-02
デベロッパーのためのクラウド活用方法

Author : 林 政利

こんにちは、ソリューションアーキテクトの林です。普段は、コンテナという技術にフォーカスして、さまざまな業種、業態のお客様を支援させていただいています。

皆様の現場では、アプリケーションをどのように構築、運用されていますか ? Java を活用されているお客様は、アプリケーションを高速に開発でき、また拡張性の高い Spring Boot を利用されている方も多いかと思います。

AWS には、 Web アプリケーションのためのフルマネージドサービス、 AWS App Runner があります。App Runner は、ソースコードを用意するだけで、そのコードをビルド、デプロイして URL を払い出し、Web アプリケーションとして動かしてくれるサービスです。

もともと、 Spring Boot は Enter を押すだけで 動くバイナリ、 Far Jar を作ってくれるわけですが、実際に本番環境を用意するとなると、C I/CD 環境を構築したり、ロードバランサーを用意したり、そこに URL を紐づけたり、オートスケーリングの仕組みを用意したり、監視したり色々やることがありますね。App Runner は、そのあたりの諸々を全てマネージドで提供しているので、お手軽に本番運用を始めることができます。

Spring Boot でサクッとアプリを作って、 App Runner でサクッとデプロイして運用する、素晴らしい組み合わせですね。

本シリーズでは、Spring Boot アプリケーションを本番環境で実施したい方向けに、App Runner にデプロイするところから始めて、データベースやキャッシュサーバーとの接続、秘匿情報の管理、Spring Boot Actuator によるメトリクスの取得とその活用、カナリアリリースを行うまでの方法を皆様にご紹介します。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

この連載記事のその他の記事はこちら

選択
  • 選択
  • 第一回 ~ Spring Boot アプリケーションをデプロイ
  • 第二回 ~VPC 内の Amazon ElastiCache へアクセス
  • 第三回 ~アプリケーションの設定情報を AWS Systems Manager Parameter Store に保存
  • 最終回 ~ App Runner サービスのモニタリング方法

この記事のデモを無料でお試しいただけます »

毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。 


Spring Boot アプリケーションの作成

まず、シンプルな Spring Boot アプリケーションを作成するところから始めましょう。あまりにシンプルすぎると思われるでしょうが、小さなところから始めることができるのも Spring Boot と App Runner による高速開発の醍醐味だと思います。

なお、本記事では、ツールのバージョンは以下の通りです。

バージョン

補足

Java 11 (Corretto-11)

  • 現在、App Runner のソースコードビルド機能が Java 11 までの対応となっています
  • なお、 App Runner はソースコードだけでなくコンテナイメージを利用することもでき、その場合は Java のバージョンに制限はありません。
Spring Boot 2.7.7
  • Spring Boot 3.0 以上を使いたいところでしたが、 3.0 から Java 17 以上が必要となるため、本手順では Spring Boot 2.7.7 を利用しています。
$ mkdir expt-apprunner-springboot && cd expt-apprunner-springboot
$ gradle init

ソースコードのビルド設定は以下の通りです。

// build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.7'
    id 'io.spring.dependency-management' version '1.1.0'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
}

それから、以下のアプリケーションコードを追加します。

// build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.7'
    id 'io.spring.dependency-management' version '1.1.0'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
}
// src/main/java/com/example/exptapprunnerspringboot/Application.java

package com.example.exptapprunnerspringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @GetMapping("/")
    public String root() {
        return "hello";
    }

}

これでアプリケーションができましたので、早速動作を確認してみましょう。

$ ./gradlew bootRun

# 別ターミナルで
$ curl http://localhost:8080
hello

Spring Boot アプリケーションのデプロイ

では、このアプリケーションを App Runner にデプロイしてみましょう。

App Runner では、GitHub 上のリポジトリを指定することで、ソースコードを読み込むことができます。そのため、コードをまず、GitHub に Push する必要があります。

$ git remote add origin git@github.com:xxx/expt-apprunner-springboot.git
$ git branch -M main
$ git add -A
$ git push -u origin main

App Runner のコンソール にアクセスして、「Create an App Runner service」を選択します。

 画像をクリックすると拡大します

Source code repository を指定し、「Add new」から GitHub への接続情報を追加します。

 画像をクリックすると拡大します
 画像をクリックすると拡大します

自動的に GitHub 上のページが読み込まれるので、Push したリポジトリを選択します。

 画像をクリックすると拡大します

次の画面で、アプリケーションの Jar をビルドするコマンドと、実際にアプリケーションを起動するコマンドを入力します。Spring Boot の場合は、以下のようになるでしょう。

Runtime

Corretto 11
Build command ./gradlew bootJar && cp build/libs/expt-apprunner-springboot.jar ./
Start command java -jar ./expt-apprunner-springboot.jar
 画像をクリックすると拡大します

任意のサービス名を入力し、後はデフォルトのまま、次の画面へ移動します。

 画像をクリックすると拡大します

いよいよデプロイです !

 画像をクリックすると拡大します

デプロイステップの確認

App Runner は、裏側で AWS Fargate を利用しており、実際には指定したソースコードから コンテナイメージをビルドし、デプロイしています。

App Runner がどのようにアプリケーションのビルドとデプロイを進めているか、「Deployment logs」をクリックすることで見ることができます。

 画像をクリックすると拡大します

以下のように、コンテナイメージをビルドしている様子が確認できますね。

02-15-2023 03:00:49 PM [Build]  ---> Running in 75c756649e99
02-15-2023 03:00:49 PM [Build] Step 3/5 : WORKDIR /app
02-15-2023 03:00:49 PM [Build]  ---> c41e3f14f082
02-15-2023 03:00:49 PM [Build] Step 2/5 : COPY . /app
02-15-2023 03:00:49 PM [Build]  ---> 45e6feb169da
02-15-2023 03:00:49 PM [Build] Status: Downloaded newer image for 380155284058.dkr.ecr.us-west-2.amazonaws.com/awsfusionruntime-corretto11:11.0.18.10.1
02-15-2023 03:00:49 PM [Build] Digest: sha256:78ea90bce6eb9b8881850fab03d984105d24ee8d7789dff9e52608f46ec6aa6d
02-15-2023 03:00:49 PM [Build] 141aabecbe17: Pull complete
02-15-2023 03:00:49 PM [Build] d198c38a2385: Pull complete
02-15-2023 03:00:49 PM [Build] 1e78b99dd1fd: Pull complete
02-15-2023 03:00:49 PM [Build] 141aabecbe17: Download complete
02-15-2023 03:00:49 PM [Build] 141aabecbe17: Verifying Checksum
02-15-2023 03:00:49 PM [Build] 1e78b99dd1fd: Download complete
02-15-2023 03:00:49 PM [Build] 1e78b99dd1fd: Verifying Checksum
02-15-2023 03:00:49 PM [Build] d198c38a2385: Download complete
02-15-2023 03:00:49 PM [Build] d198c38a2385: Verifying Checksum
02-15-2023 03:00:49 PM [Build] 141aabecbe17: Pulling fs layer
02-15-2023 03:00:49 PM [Build] d198c38a2385: Pulling fs layer
02-15-2023 03:00:49 PM [Build] 1e78b99dd1fd: Pulling fs layer
02-15-2023 03:00:49 PM [Build] 11.0.18.10.1: Pulling from awsfusionruntime-corretto11
02-15-2023 03:00:49 PM [Build] Step 1/5 : FROM 380155284058.dkr.ecr.us-west-2.amazonaws.com/awsfusionruntime-corretto11:11.0.18.10.1
02-15-2023 03:00:49 PM [Build] Sending build context to Docker daemon  35.61MB

これで Spring Boot アプリケーションがデプロイできました。「Status」が 「Running」 になっていることを確認し、動作を確認してみましょう。

$ curl <Default domain に表示されたURL>
hello

まとめ

無事、Spring Boot アプリケーションをデプロイできましたね ! Spring Boot と App Runner を活用することで、簡単にお手元のソースコードを Web アプリケーションとして公開できることが分かりました。

しかし、実際のアプリケーションでは、他にもやることがたくさんあるはずです !

次回の記事では、 キャッシュストアとしてよく利用される Redis を Amazon ElastiCache で用意し、そのキャッシュサーバーに Spring Data Redis を使って接続してみます。

ただ、ElastiCache などさまざまな AWS のリソースと連携するようになると、今回のようにコンソールからポチポチ操作していくと面倒になりますし、オペミスにもつながりますね。次回の記事では、App Runner および連携サービスを AWS が開発している IaC ツールである AWS CDK と使って管理する手順をご紹介します。

記事を読み進めるにつれ、シンプルなアプリケーションだけでなく、データベースやキャッシュストアと連携した一般的なアプリケーションを手軽に運用できることをご体感いただけるでしょう。どうぞお楽しみに !


第 2 回記事はこちら »

この連載記事のその他の記事はこちら

選択
  • 選択
  • 第一回 ~ Spring Boot アプリケーションをデプロイ
  • 第二回 ~VPC 内の Amazon ElastiCache へアクセス
  • 第三回 ~アプリケーションの設定情報を AWS Systems Manager Parameter Store に保存
  • 最終回 ~ App Runner サービスのモニタリング方法

builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます


筆者プロフィール

林 政利 (@literalice)
アマゾン ウェブ サービス ジャパン合同会社
コンテナスペシャリスト ソリューションアーキテクト

フリーランスや Web 系企業で業務システムや Web サービスの開発、インフラ運用に従事。近年はベンダーでコンテナ技術の普及に努めており、現在、AWS Japan で Amazon ECS や Amazon EKS でのコンテナ運用や開発プロセス構築を中心にソリューションアーキテクトとして活動中。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する