Spring Boot × React アプリを AWS に本番デプロイ!後編:ALB × Auto Scalingで構築してみた
はじめに
これまで、Spring Boot + React を使って「イベント予約管理アプリ」を開発してきました。
ローカル環境で Docker を使って動かせるようにしたり、React で画面を作ったりと、一歩一歩成長を実感できる開発の連続でした。
そして今回は、いよいよ「アプリを本番環境へ」ということで、
AWS の Auto Scaling と Application Load Balancer(ALB)を使って、スケーラブルで安定した構成にチャレンジしてみました。
この記事では、
- サーバー起動時に Docker コンテナが自動で起動するように設定
- AMI を作成
- Auto Scaling グループと ALB を組み合わせて設定
- ブラウザからアプリを確認できるようにする
という流れを、実際の開発ログと一緒に丁寧に紹介していきます。
なお、Docker のイメージを ECR にプッシュして使う構成ではなく、
あくまで「EC2 + AMI + Docker Compose」というシンプルな構成で本番環境を構築しています。
AWS の学習中の方や、まず一度本番公開をしてみたいという方にも、参考になる構成だと思います。
これまでの学習・開発ログ
- 学習計画を立てた話
- Javaの基礎とオブジェクト指向を学んでみた感想
- Spring Bootのローカル環境構築
- Spring BootでのEntity + Repository実装
- Spring Bootで予約機能を実装してみた|バリデーション・例外処理
- Spring Boot × React で作るイベント予約管理システム(フロントエンド編)
- Docker Composeで開発環境を一体化
- [EC2 + RDS + Dockerで構築してみた]
(https://zenn.dev/hiruma_devlog/articles/600a54bb8c6d1a)
今回構築する全体像
今回の記事では、以下のような構成で AWS 上にアプリをデプロイし、本番環境として動かせる仕組みを構築していきます。
ポイントとなる構成要素
-
AMI(Amazon Machine Image)
- サーバー起動時に Docker コンテナが自動で起動するように設定した EC2 のイメージを作成します。
-
起動テンプレート
- AMI を元にインスタンスを自動起動させるためのテンプレートです。
-
Auto Scaling グループ
- 最小 1 台・最大 N 台などのスケーリング条件を設定し、EC2 を自動で起動・終了します。
- 異なるアベイラビリティゾーン(AZ)にインスタンスを分散させる構成にします。
-
Application Load Balancer(ALB)
- 複数の EC2 に対してリクエストを振り分け、冗長性・可用性を高めます。
-
ターゲットグループ
- ALB からのリクエスト先となる EC2 インスタンス群です。
- ヘルスチェックのステータスに応じて ALB がルーティングを判断します。
ゴール
- ブラウザからロードバランサーの DNS(URL)にアクセスすると、React のフロントエンドが表示される
- Auto Scaling により、インスタンスが自動で起動し、アプリが常に動いている状態になる
- サーバー起動時に手動で Docker を起動しなくても、自動でアプリが立ち上がる
Dockerコンテナをサーバー起動時に自動起動させる設定
今回は、EC2インスタンスが起動したときに docker-compose
によってアプリケーションが自動で立ち上がるように設定しました。
これを実現するには、systemdサービスとして docker-compose
を登録します。
1. 作業ディレクトリの確認
まず、docker-compose.yml
があるディレクトリを確認します。今回は /home/ubuntu
にあります。
$ cd ~
$ ls
docker-compose.yml
2. systemdサービスファイルを作成
次に、docker-compose
を systemd サービスとして登録するためのサービスファイルを作成します。
sudo vi /etc/systemd/system/docker-compose-app.service
以下の内容を記述します
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service
[Service]
WorkingDirectory=/home/ubuntu
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
Restart=always
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
※ WorkingDirectory
と ExecStart
のパスは、自分の環境に合わせて設定してください。
3. 権限と有効化
作成したサービスを systemd に認識させ、起動時に有効化します。
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable docker-compose-app
4. サービスの起動と確認
サービスを起動して、正常に Docker コンテナが立ち上がるか確認します。
sudo systemctl start docker-compose-app
sudo systemctl status docker-compose-app
コンテナが起動しているか確認
docker ps
アプリが起動していれば成功です!
この設定により、EC2がAuto Scalingにより再起動・再作成されたとしても、アプリが自動で立ち上がる状態を維持できます。
AMI(Amazon Machine Image)の作成
Dockerコンテナがサーバー起動時に自動起動するように設定できたら、その状態を元に AMI(Amazon Machine Image) を作成します。
AMIを作っておくことで、Auto Scaling グループで同じ構成のインスタンスを複製・起動できるようになります。
✅ 注意点:EC2が「起動中」であること!
AMIは 現在起動中のEC2インスタンス から作成する必要があります。
停止しているインスタンスでは作成できないので、事前に該当インスタンスを起動しておきましょう。
1. EC2 ダッシュボードにアクセス
AWSマネジメントコンソールで EC2 の画面にアクセスし、対象のインスタンスを選択します。
2. 「イメージを作成」を選択
- 対象インスタンスを右クリック、または「アクション」メニューを開く
- 「イメージとテンプレート」→「イメージの作成」をクリック
3. イメージの設定
以下の項目を設定します:
項目 | 入力例 |
---|---|
イメージ名 | event-reservation-ami-v1 |
イメージの説明 | アプリ+Docker自動起動構成 |
無停止での作成 | ✅ チェック(推奨) |
v1
や v2
を付ける理由
💡 補足:イメージ名に AMIは上書き更新できず、バージョン管理の機能もありません。
そのため、設定を更新するたびに新しいバージョン名(例:-v2
, -v3
)を付けて管理するようです。
4. 作成された AMI を確認
左サイドバーの「AMI」メニューから、作成したイメージのステータスを確認します。
ステータスが 「available(利用可能)」 になったら準備完了です!
起動テンプレートの作成
先ほど作成した AMI を使って、EC2の 起動テンプレート(Launch Template) を作成します。
起動テンプレートは、Auto Scaling グループが新しい EC2 を起動する際の「設計図」となります。
1. EC2 ダッシュボード →「起動テンプレート」を選択
左メニューから 「起動テンプレート」 をクリックし、「テンプレートを作成」ボタンを押します。
2. テンプレート情報を入力
以下のように入力します:
項目 | 内容例 |
---|---|
テンプレート名 | event-reservation-template |
テンプレートバージョンの説明 | 初回テンプレート作成 |
AMI ID |
作成したAMI を選択(例:event-reservation-ami-v1 ) |
インスタンスタイプ |
t3.micro や t3.small などコストに応じて |
キーペア | SSH接続で使うキーペアを選択(例: EC2で作ったキーペアを使ってOK ) |
3. ネットワーク設定(VPC)
ネットワーク設定は、後ほど Auto Scaling グループ側で設定します。
ここでは「デフォルトのまま」でOKです。
4. セキュリティグループを選択
Auto Scaling の EC2 インスタンスには、ALB 経由でアクセスを受ける構成にするため、以下のようにセキュリティグループを設定します。
例:
- インバウンド:ポート80(HTTP)を 0.0.0.0/0 に許可
- アウトバウンド:全開放(デフォルトでOK)
5. テンプレート作成
すべて入力が完了したら、「テンプレートを作成」をクリックして完了です。
Auto Scaling グループの作成
ここでは、作成した 起動テンプレート をもとに、アプリケーション用の Auto Scaling グループ(ASG) を構築していきます。
1.Auto Scaling グループを作成
EC2 ダッシュボード → 左メニューから「Auto Scaling グループ」を選択
「Auto Scaling グループを作成」をクリック
2.Auto Scaling グループ名と起動テンプレート
- Auto Scaling グループ名:例)asg-event-app
- 起動テンプレート:先ほど作成したテンプレートを選択
- バージョン:最新バージョンを選択
3. ネットワークとサブネット
- VPC:作成済みのVPCを選択
- サブネット:異なるアベイラビリティゾーン(AZ)から2つ以上選択
異なるAZを選ぶことで、冗長構成(可用性の高い構成)を実現できます!
4. インスタンス数の設定
- 希望するキャパシティ:2
- 最小キャパシティ:2
- 最大キャパシティ:2
お好きなキャパシティーで良いですが、2台構成で起動できていることを確認するために「2」を設定
5. 作成を確認して完了
内容を確認して、「Auto Scaling グループを作成」をクリック
→ 数分後に EC2 インスタンスが自動的に起動され、ALB と連携されます
ターゲットグループを作成
- AWSマネジメントコンソールで
EC2サービス
に行く - 左メニューの「ターゲットグループ」を選択
- 「ターゲットグループを作成」をクリック
- 以下を設定
-
ターゲットグループ名:例)
tg-event-app
-
ターゲットタイプ:
インスタンス
-
プロトコル:
HTTP
-
ポート:
8080
(アプリケーションがリッスンしているポートに合わせる) - VPC:作成済みのVPCを選択
- 作成後にターゲット(EC2インスタンス)を登録する
ALB(Application Load Balancer)を作成してアプリにアクセス
1.ALBの作成
- AWSマネジメントコンソールから「EC2」→「ロードバランサー」→「ロードバランサーを作成」
- 種類は「Application Load Balancer」を選択
- 以下の情報を入力:
設定項目 | 値(例) |
---|---|
名前 | alb-event-app |
スキーム | インターネット向け |
IPアドレスタイプ | IPv4 |
リスナー | HTTP : 80 を追加済み |
VPC | 作成済みのVPCを選択 |
アベイラビリティゾーン | サブネット(2つ以上)を選択 |
2.セキュリティグループの選択
-
HTTP(ポート80) を許可したセキュリティグループ(例:
sg-ec2
)を選択
3.ターゲットグループの設定
- 既に作成したターゲットグループ(例:
tg-event-app
)を選択
設定を確認して「ロードバランサーを作成」
ALBとAuto Scaling グループの紐づけ
1.Auto Scaling グループの編集
- AWSマネジメントコンソールで「EC2」→「Auto Scaling グループ」を開く
- 対象のAuto Scaling グループ(例:
asg-event-app
)をクリック - 上部メニューから「編集」をクリック
2.「ロードバランシング」セクションを編集
- ロードバランサーの種類 → 「Application Load Balancer」を選択
-
ターゲットグループ → 既存の
tg-event-app
を選択 - 他の設定はそのままでOK
3.保存して完了
- 「更新」をクリックして保存すれば、ALB ⇄ ターゲットグループ ⇄ Auto Scaling グループの紐づけ完了
.動作確認
- 作成したALBの DNS名 をコピー
- ブラウザでアクセス
- Reactアプリのトップページが表示されれば成功!
まとめ
今回のアプリ開発では、Java を一から学習し、
バックエンド(Spring Boot)とフロントエンド(React)を組み合わせたアプリケーションを構築しました。
さらに、Docker を活用した環境構築、
AWS 上でのオートスケーリングやロードバランサーの設定など、
インフラ面までしっかりと取り組んできたことで、アプリを本番環境にデプロイできるところまで到達することができました
今後は、次のステップとして Java Silver(Oracle認定Javaプログラマ Silver) の資格取得に向けて勉強を進めていきます
この記事が、これから Java やクラウドの勉強を始めようとしている方の参考になればうれしいです。
引き続き頑張っていきますので、今後ともよろしくお願いします!
Discussion
素晴らしい…!
このままAWSの資格も取れてしまいそうな気がしてきますね。
LinuCで勉強したけど、ロードバランサー作ったことなかったのでこちら参考にさせていただきます!
1.ALBの作成
の3. 以下の情報を入力:
の表が生の markdown になってます…!AWSで構築だけしてすべてのオブジェクトを削除すればお金もかからないのでやってみてください!
あっ修正しておきます。