メインコンテンツに移動
デベロッパーのためのクラウド活用方法

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 によるメトリクスの取得とその活用、カナリアリリースを行うまでの方法を皆様にご紹介します。


X ポスト » | Facebook シェア » | はてブ »

ご注意

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

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

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。

今すぐ特典を受け取る »

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 を利用しています。

ディレクトリを作成

コマンド

bash
$ mkdir expt-apprunner-springboot && cd expt-apprunner-springboot
$ gradle init

ソースコードのビルド

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

java
// 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')
}

アプリケーションコードを追加

それから、以下のアプリケーションコードを追加します。ビルド設定は以下の通りです。

java
// 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";
    }

}

動作確認

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

java
$ ./gradlew bootRun

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

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

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

GitHub に コードを Push

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

bash
$ 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 のコンソール にアクセス

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

Banner image promoting AWS App Runner, featuring the text 'AWS App Runner: Build and run production web applications at scale' and a call-to-action button to create an App Runner service.

GitHub への接続情報を追加

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

Screenshot of the AWS App Runner interface showing the option to connect to a source code repository via GitHub for deploying a service, with options to select between container registry and source code repository.

Screenshot of the AWS App Runner interface for creating a new connection to GitHub, showing options to name the connection and select or install a GitHub app for deployment integration.

Push したリポジトリを選択

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

Screenshot of the AWS App Runner interface showing the process to connect to GitHub, with 'AWS Connector for GitHub' for deploying code from the expt-apprunner-springboot repository on the main branch.

Build と Start コマンドを入力

次の画面で、アプリケーションの 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

Screenshot of the AWS App Runner build settings console showing configuration for Corretto 11, including build command, start command, and port settings.

任意のサービス名を入力

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

Screenshot of the AWS App Runner 'Configure service' settings page, showing service name input as 'expt-apprunner-springboot' and options to select virtual CPU and memory settings.

デプロイ

いよいよデプロイです !

Screenshot of the AWS App Runner console showing observability settings (set to off) and tags (none configured) during the create and deploy process for a Spring Boot application using AWS Cloud Development Kit (CDK). The 'Create & deploy' button is highlighted.

デプロイステップの確認

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

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

Screenshot of the AWS AppRunner console showing deployment logs for a Spring Boot application created and deployed with AWS CDK, highlighting a service creation event in progress.

コンテナイメージをビルド

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

bash
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」 になっていることを確認し、動作を確認してみましょう。

bash
$ 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 と使って管理する手順をご紹介します。

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

筆者プロフィール

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

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

A portrait photo of a person with short dark hair and glasses, smiling and wearing a jacket, standing indoors in front of a reflective wall.