AWSコンソールでSpring Boot WebアプリをALB + EC2(Tomcat) + RDS にデプロイする手順【WAR / JdbcTemplate / CRUD】

AWS Basic
スポンサーリンク
スポンサーリンク
  1. はじめに
  2. キーワード解説
  3. 前フェーズとの違い
  4. 使用するAWSサービス
  5. 構築するリソース一覧
  6. 全体の作業順序
  7. ⓪ Webアプリのビルド
  8. ⓪-2 自分のIPアドレスの確認
  9. ① キーペアの作成
  10. ② VPCの作成
  11. ③ サブネットの作成(4つ)
    1. パブリックサブネットのIPv4自動割り当てを有効化
  12. ④ インターネットゲートウェイの作成・アタッチ
    1. 作成
    2. VPCへのアタッチ
  13. ⑤ ルートテーブルの設定
    1. 5-1. パブリック用ルートテーブル
    2. 5-2. プライベート用ルートテーブル
  14. ⑥ セキュリティグループの作成
    1. 6-1. ALB用セキュリティグループ
    2. 6-2. EC2用セキュリティグループ
    3. 6-3. RDS用セキュリティグループ
  15. ⑦ IAMロールの作成
    1. 信頼されたエンティティ
    2. 許可ポリシー
    3. ロール名
  16. ⑧ SSM Parameter Storeの作成
  17. ⑨ RDS DBサブネットグループの作成
  18. ⑩ RDS MySQL インスタンスの作成
    1. エンジンの選択
    2. テンプレート
    3. 設定
    4. インスタンスの設定
    5. ストレージ
    6. 接続
    7. 追加設定
  19. ⑪ EC2インスタンスの起動(Tomcat)
    1. 基本設定
    2. ネットワーク設定
    3. IAMロール
    4. UserData
  20. ⑫ ターゲットグループの作成
    1. ヘルスチェック
    2. ターゲットの登録
  21. ⑬ ALBの作成・リスナー設定
    1. 基本的な設定
    2. ネットワークマッピング
    3. セキュリティグループ
    4. リスナーとルーティング
  22. ⑭ Webアプリのデプロイ
    1. 14-1. EC2にSSH接続する
    2. 14-2. setenv.sh を作成してDB接続情報を注入する
    3. 14-3. WARファイルをEC2に転送する
    4. 14-4. Tomcatを停止してWARをデプロイする
    5. 14-5. デプロイを確認する
  23. ⑮ 動作確認
    1. 15-1. ALBのヘルスチェック確認
    2. 15-2. ALB経由でWebアプリにアクセスする
    3. 15-3. アイテムの追加・削除を試す
    4. 15-4. RDSのデータをSQLで直接確認する(任意)
  24. ⑯ リソースの削除
    1. 削除順序
    2. 1. ALBを削除する
    3. 2. ターゲットグループを削除する
    4. 3. EC2インスタンスを終了する
    5. 4. RDSインスタンスを削除する
    6. 5. RDS DBサブネットグループを削除する
    7. 6. SSM Parameter Storeを削除する
    8. 7. IAMロールを削除する
    9. 8. セキュリティグループを削除する
    10. 9. VPCを削除する
    11. 10. キーペアを削除する(任意)
  25. トラブルシューティング
  26. まとめ

はじめに

前回のAWSコンソール版ハンズオン(ALB + EC2 + RDS)では、Tomcatに静的HTMLを配置して3層構成を体験しました。

今回はそこからさらに一歩進め、Spring Boot + Maven で作成したWebアプリケーションをWARファイルとしてビルドし、EC2(Tomcat)にデプロイして RDS MySQLにJDBCで接続するCRUDアプリを動かすハンズオンを紹介します。

インターネット
  ↓ HTTP(80)  ← ALB SGで全IPから許可
ALB(my-webapp-alb)
  [パブリックサブネット1: 10.0.1.0/24 AZ-a]
  [パブリックサブネット2: 10.0.2.0/24 AZ-c]  ← ALBの2AZ要件
  ↓ HTTP(8080)  ← EC2 SGでALB SGからのみ許可(SG-to-SG)
EC2(my-webapp-ap-instance)
  Tomcat 10 + webapp.war(Spring Boot)
  [パブリックサブネット1: 10.0.1.0/24 AZ-a]
  ↓ JDBC/MySQL(3306)  ← RDS SGでEC2 SGからのみ許可(SG-to-SG)
RDS MySQL(my-webapp-rds-mysql)← sampledb / items テーブル
  [プライベートサブネット1: 10.0.3.0/24 AZ-a]

このハンズオンで体験できること:

  • Spring Boot WebアプリをMavenでWARファイルにビルドする方法
  • SCPでWARをEC2に転送してTomcatにデプロイする手順
  • SSM Parameter StoreのDB接続情報をEC2上の環境変数として注入する方法
  • JdbcTemplateでRDS MySQLにCRUD操作するSpring Bootアプリの動作

アプリのソースコード・CloudFormationテンプレートはGitHubで公開しています:

aws-handson/alb-ec2-rds-webapp at main · caymezon/aws-handson
AWS HANDSON. Contribute to caymezon/aws-handson development by creating an account on GitHub.

この記事は CloudFormation版ハンズオン の比較記事です。
コンソール操作でWARのデプロイ手順を手を動かして確認したい方向けです。


-->

スポンサーリンク

キーワード解説

用語意味
Spring BootJavaの代表的なWebアプリフレームワーク。設定ファイルを最小限にしてWebアプリを素早く作れる
MavenJavaのビルドツール。mvn package でWARファイルを生成する
WAR(Web Application Archive)JavaのWebアプリをTomcatにデプロイするためのパッケージ形式
JdbcTemplateSpring FrameworkのDB操作クラス。SQLを直接書いてDBを操作できる
ThymeleafSpring Bootで使われるHTMLテンプレートエンジン
SCPSSH経由でファイルを転送するコマンド。scp でWARをEC2に送る
setenv.shTomcatが起動時に読み込むシェルスクリプト。環境変数を設定してJVMに渡す

スポンサーリンク

前フェーズとの違い

比較項目前回(ALB + EC2 + RDS)今回(Webアプリ版)
EC2のコンテンツ静的HTML(手書き)Spring Boot WARアプリ
DB接続なしJdbcTemplateでRDS接続
画面テキストのみアイテム一覧・追加・削除(CRUD)
WARデプロイなしSCPで転送 → Tomcatに配置
DB設定の渡し方なしSSMから取得して環境変数(setenv.sh)で注入

使用するAWSサービス

サービス役割料金
VPCカスタムネットワーク空間無料
EC2(t2.micro)APサーバ(Tomcat)月750時間まで無料枠あり
RDS MySQL(db.t3.micro)マネージドDBサーバ月750時間まで無料枠あり
ALBロードバランサー約$0.008/時間 + LCU料金(無料枠なし
SSM Parameter StoreDBパスワードの安全な保管スタンダード層は無料
IAMEC2にSSM・Parameter Store権限を付与無料

注意: ALBは無料枠がありません。ハンズオン後は必ず削除してください。


構築するリソース一覧

順序リソース役割
(前提)Webアプリのビルドwebapp.war の生成
⓪-2自分のIPアドレスの確認SGのSSHルール設定に使用
キーペア(my-webapp-keyEC2へのSSH・SCP認証鍵
VPC(my-webapp-vpc独立したネットワーク空間
サブネット × 4パブリック2 + プライベート2
インターネットゲートウェイ(my-webapp-igwVPCをインターネットに接続
ルートテーブル × 2パブリック/プライベートの通信経路
セキュリティグループ × 3ALB用・EC2用・RDS用
IAMロール(my-webapp-ec2-roleEC2がSSM・Parameter Storeを使う権限
SSM Parameter Store(/my/webapp/db-passwordDBパスワードの保管
RDS DBサブネットグループRDSを配置できるサブネットを登録
RDS MySQL インスタンス(my-webapp-rds-mysqlマネージドDBサーバ(作成に10〜15分)
EC2インスタンス(my-webapp-ap-instanceAPサーバ(Tomcat)
ターゲットグループ(my-webapp-tgALBのトラフィック転送先の定義
ALB(my-webapp-alb) + リスナーロードバランサー本体
WebアプリのデプロイWARをEC2に転送・Tomcatに配置
動作確認ALB経由でWebアプリにアクセス
リソース削除課金停止

全体の作業順序

⓪ Webアプリをビルドする(mvn package)
      ↓
⓪-2 自分のIPアドレスを確認する
      ↓
① キーペア作成
      ↓
② VPC作成
      ↓
③ サブネット作成(4つ)
      ↓
④ インターネットゲートウェイ作成・アタッチ
      ↓
⑤ ルートテーブル設定
      ↓
⑥ セキュリティグループ作成(ALB用・EC2用・RDS用)
      ↓
⑦ IAMロール作成
      ↓
⑧ SSM Parameter Store作成
      ↓
⑨ RDS DBサブネットグループ作成
      ↓
⑩ RDS MySQL インスタンス作成(※約10〜15分かかる)
      ↓
⑪ EC2インスタンス起動(Tomcat)
      ↓
⑫ ターゲットグループ作成
      ↓
⑬ ALB作成・リスナー設定
      ↓
⑭ Webアプリのデプロイ(WAR転送・Tomcat起動)
      ↓
⑮ 動作確認(ALB → EC2 → RDS CRUD)
      ↓
⑯ リソース削除

⓪ Webアプリのビルド

Webアプリのソースコードはこちら:

aws-handson/alb-ec2-rds-webapp/app at main ?? caymezon/aws-handson
AWS HANDSON. Contribute to caymezon/aws-handson development by creating an account on GitHub.

GitHubからクローンするか、ローカルにすでにあるソースコードを使います。

ビルド前の確認:

java -version
mvn -version

Java 17以上、Maven 3.x が表示されることを確認します。

WARファイルをビルドする:

cd C:\(プロジェクトフォルダ)\alb-ec2-rds-webapp\app
mvn package -DskipTests

-DskipTests はローカルにDBがないためテストをスキップします。初回は依存ライブラリのダウンロードで数分かかります。

[INFO] BUILD SUCCESS

ビルド成果物を確認する:

dir target\webapp.war

webapp.war(約20〜30MB)が生成されていれば成功です。

アプリの機能: アイテム一覧表示・追加・削除の3機能。Spring Boot + JdbcTemplate + Thymeleaf で構成されています。DB接続情報は環境変数(DB_HOSTDB_PASSWORD)から読み込みます。


⓪-2 自分のIPアドレスの確認

https://checkip.amazonaws.com

控えておく情報: 自分のIPアドレス(例: 203.0.113.1

セキュリティグループで 203.0.113.1/32 の形式(末尾に /32)で使用します。


① キーペアの作成

AWSコンソール → EC2 → キーペア → 「キーペアを作成」

設定項目
名前my-webapp-key
キーペアのタイプRSA
プライベートキーファイル形式.pem

「キーペアを作成」をクリック。ダウンロードされた .pem ファイルを保存します。

C:\Users\ユーザー名\.ssh\my-webapp-key.pem

② VPCの作成

AWSコンソール → VPC → 「VPCを作成」

設定項目
作成するリソースVPCのみ
名前タグmy-webapp-vpc
IPv4 CIDR10.0.0.0/16

「VPCを作成」をクリック。


③ サブネットの作成(4つ)

AWSコンソール → VPC → サブネット → 「サブネットを作成」

VPCに my-webapp-vpc を選択して、以下の4つを1回の操作で作成します(「新しいサブネットを追加」で追加できます)。

名前AZIPv4 CIDR用途
my-webapp-public-subnet-1ap-northeast-1a10.0.1.0/24ALB + EC2
my-webapp-public-subnet-2ap-northeast-1c10.0.2.0/24ALB(2AZ必須)
my-webapp-private-subnet-1ap-northeast-1a10.0.3.0/24RDS配置
my-webapp-private-subnet-2ap-northeast-1c10.0.4.0/24DBサブネットグループ用

「サブネットを作成」をクリック。

パブリックサブネットのIPv4自動割り当てを有効化

my-webapp-public-subnet-1my-webapp-public-subnet-2 それぞれに対して:

サブネットを選択 → 「アクション」→「サブネットの設定を編集」→ 「パブリックIPv4アドレスの自動割り当てを有効化」 にチェック → 「保存」


④ インターネットゲートウェイの作成・アタッチ

作成

AWSコンソール → VPC → インターネットゲートウェイ → 「インターネットゲートウェイを作成」

設定項目
名前タグmy-webapp-igw

「インターネットゲートウェイを作成」をクリック。

VPCへのアタッチ

作成したIGWを選択 → 「アクション」→「VPCにアタッチ」→ my-webapp-vpc を選択 → 「インターネットゲートウェイのアタッチ」


⑤ ルートテーブルの設定

注意: EC2を起動する前にこの手順を完了させてください。IGWルートがない状態でEC2を起動すると、UserDataのTomcatインストールが失敗します。

5-1. パブリック用ルートテーブル

AWSコンソール → VPC → ルートテーブル → 「ルートテーブルを作成」

設定項目
名前my-webapp-public-rt
VPCmy-webapp-vpc

作成後、「ルート」タブ → 「ルートを編集」→「ルートを追加」

送信先ターゲット
0.0.0.0/0インターネットゲートウェイ my-webapp-igw

「変更を保存」をクリック。

「サブネットの関連付け」タブ → 「サブネットの関連付けを編集」→ パブリックサブネット2つにチェック → 保存

  • my-webapp-public-subnet-1
  • my-webapp-public-subnet-2

5-2. プライベート用ルートテーブル

設定項目
名前my-webapp-private-rt
VPCmy-webapp-vpc

「サブネットの関連付けを編集」→ プライベートサブネット2つにチェック → 保存

  • my-webapp-private-subnet-1
  • my-webapp-private-subnet-2

⑥ セキュリティグループの作成

6-1. ALB用セキュリティグループ

AWSコンソール → EC2 → セキュリティグループ → 「セキュリティグループを作成」

設定項目
セキュリティグループ名my-webapp-alb-sg
説明ALB SG - HTTP:80 from internet
VPCmy-webapp-vpc

インバウンドルール:

タイプポートソース説明
HTTP800.0.0.0/0HTTP from internet

なぜ全開放か: ALBはWebサービスの入口なので不特定多数を許可。EC2はALB SGからのみ8080番を受け付けるSG-to-SG制御で守られています。

6-2. EC2用セキュリティグループ

設定項目
セキュリティグループ名my-webapp-ec2-sg
説明EC2 Tomcat SG - Tomcat:8080 from ALB SG, SSH from MyIP
VPCmy-webapp-vpc

インバウンドルール:

タイプポートソース説明
カスタムTCP8080my-webapp-alb-sgSGを選択Tomcat from ALB SG only
SSH22自分のIP/32SSH from my IP(SCPにも必要)

アウトバウンドルール(変更しない):

タイププロトコル送信先
すべてのトラフィックすべて0.0.0.0/0

アウトバウンドルールを削除してはいけない: EC2からのTomcatインストール(パッケージダウンロード)に必要です。

6-3. RDS用セキュリティグループ

設定項目
セキュリティグループ名my-webapp-rds-sg
説明RDS MySQL SG - MySQL:3306 from EC2 SG only
VPCmy-webapp-vpc

インバウンドルール:

タイプポートソース説明
MySQL/Aurora3306my-webapp-ec2-sgSGを選択MySQL from EC2 SG only

⑦ IAMロールの作成

AWSコンソール → IAM → ロール → 「ロールを作成」

信頼されたエンティティ

設定項目
信頼されたエンティティタイプAWSのサービス
サービスEC2

許可ポリシー

ポリシー名用途
AmazonSSMManagedInstanceCoreSession Manager接続用
AmazonSSMReadOnlyAccessParameter Storeからパスワードを読み取る

ロール名

設定項目
ロール名my-webapp-ec2-role

「ロールを作成」をクリック。


⑧ SSM Parameter Storeの作成

AWSコンソール → Systems Manager → パラメータストア → 「パラメータの作成」

設定項目
名前/my/webapp/db-password
説明RDS MySQL master password for webapp hands-on
スタンダード
タイプ安全な文字列(SecureString・推奨)
KMS キーIDalias/aws/ssm(デフォルト)
(任意のパスワード。例: Handson1234!

「パラメータの作成」をクリック。

SecureStringとは: KMSで暗号化して保存するタイプです。取得時は --with-decryption オプションが必要です。CloudFormation版はString型になりますが、コンソールではSecureStringを推奨します。


⑨ RDS DBサブネットグループの作成

AWSコンソール → Aurora and RDS → サブネットグループ → 「DBサブネットグループの作成」

設定項目
名前my-webapp-rds-subnet-group
説明webapp RDS subnet group
VPCmy-webapp-vpc

アベイラビリティーゾーンとサブネットの追加:

AZサブネット
ap-northeast-1amy-webapp-private-subnet-1
ap-northeast-1cmy-webapp-private-subnet-2

「作成」をクリック。


⑩ RDS MySQL インスタンスの作成

AWSコンソール → Aurora and RDS → データベース → 「データベースの作成 ▲」→「フル設定」

「フル設定」を選ぶ: VPC・サブネットグループ・SGなどを細かく指定するため、必ず「フル設定」を選択します。

注意: RDSの作成は約10〜15分かかります。

エンジンの選択

設定項目
エンジンのタイプMySQL
エンジンバージョンMySQL 8.0.x(最新)

テンプレート

設定項目
テンプレート無料利用枠

設定

設定項目
DBインスタンス識別子my-webapp-rds-mysql
マスターユーザー名admin
マスターパスワード⑧で設定したパスワード

インスタンスの設定

設定項目
DBインスタンスクラスdb.t3.micro

ストレージ

設定項目
ストレージタイプ汎用SSD (gp2)
割り当てられたストレージ20 GiB
ストレージの自動スケーリングチェックを外す

接続

設定項目
コンピューティングリソースEC2コンピューティングリソースに接続しない
VPCmy-webapp-vpc
DBサブネットグループmy-webapp-rds-subnet-group
パブリックアクセスなし
VPCセキュリティグループ既存の選択my-webapp-rds-sgdefault は削除)
アベイラビリティーゾーンap-northeast-1a

追加設定

「追加設定」を開きます。

設定項目
最初のデータベース名sampledb
自動バックアップを有効にするチェックを外す

「データベースの作成」をクリック。

控えておく情報: 作成完了後の「エンドポイント」ホスト名

my-webapp-rds-mysql.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

⑪ EC2インスタンスの起動(Tomcat)

注意: EC2を起動する前に⑤のルートテーブル設定が完了していることを確認してください。

AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」

基本設定

設定項目
名前my-webapp-ap-instance
AMIAmazon Linux 2023 AMI
インスタンスタイプt2.micro
キーペアmy-webapp-key

ネットワーク設定

「編集」をクリックして以下を設定します。

設定項目
VPCmy-webapp-vpc
サブネットmy-webapp-public-subnet-1
パブリックIPの自動割り当て有効化
セキュリティグループ既存のセキュリティグループを選択my-webapp-ec2-sg

IAMロール

「高度な詳細」→「IAMインスタンスプロファイル」→ my-webapp-ec2-role を選択

UserData

「高度な詳細」→「ユーザーデータ」に以下を貼り付けます。

このUserDataではTomcatをインストールするのみです。アプリのデプロイは⑭で手動で行います。

#!/bin/bash
set -xe
exec > >(tee /var/log/user-data.log) 2>&1

dnf install -y java-17-amazon-corretto wget

TOMCAT_VERSION="10.1.28"
cd /opt
wget -q https://archive.apache.org/dist/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz
tar xzf apache-tomcat-${TOMCAT_VERSION}.tar.gz
mv apache-tomcat-${TOMCAT_VERSION} tomcat
chmod +x /opt/tomcat/bin/*.sh

cat > /opt/tomcat/webapps/ROOT/index.html << 'HTMLEOF'
<html><body><h1>Tomcat is ready. Deploy webapp.war to complete setup.</h1></body></html>
HTMLEOF

/opt/tomcat/bin/startup.sh

「インスタンスを起動」をクリック。

控えておく情報: インスタンスのパブリックIPアドレス


⑫ ターゲットグループの作成

AWSコンソール → EC2 → ターゲットグループ → 「ターゲットグループの作成」

設定項目
ターゲットタイプインスタンス
ターゲットグループ名my-webapp-tg
プロトコルHTTP
ポート8080
VPCmy-webapp-vpc
プロトコルバージョンHTTP1

ヘルスチェック

設定項目
ヘルスチェックプロトコルHTTP
ヘルスチェックパス/

「次へ」をクリック。

ターゲットの登録

一覧から my-webapp-ap-instance を選択 → ポートが 8080 であることを確認 → 「保留中として以下を含める」をクリック → 「ターゲットグループの作成」


⑬ ALBの作成・リスナー設定

AWSコンソール → EC2 → ロードバランサー → 「ロードバランサーの作成」

「Application Load Balancer」の「作成」をクリック。

基本的な設定

設定項目
ロードバランサー名my-webapp-alb
スキームインターネット向け
IPアドレスタイプIPv4

ネットワークマッピング

設定項目
VPCmy-webapp-vpc
アベイラビリティーゾーンap-northeast-1amy-webapp-public-subnet-1)と ap-northeast-1cmy-webapp-public-subnet-2)の両方を選択

セキュリティグループ

my-webapp-alb-sg のみを選択(デフォルトSGは削除)。

リスナーとルーティング

設定項目
プロトコルHTTP
ポート80
デフォルトアクションmy-webapp-tg に転送

「ロードバランサーの作成」をクリック。

控えておく情報: 「DNS名」(例: my-webapp-alb-1234567890.ap-northeast-1.elb.amazonaws.com


⑭ Webアプリのデプロイ

これが前回のハンズオンとの最大の違いです。WARファイルをEC2に転送してTomcatにデプロイします。

14-1. EC2にSSH接続する

ssh -i C:\Users\ユーザー名\.ssh\my-webapp-key.pem ec2-user@(EC2のパブリックIP)

14-2. setenv.sh を作成してDB接続情報を注入する

TomcatはEC2起動時に /opt/tomcat/bin/setenv.sh を読み込み、環境変数をJVMに渡します。Spring Bootアプリは DB_HOSTDB_PASSWORD 環境変数からDB接続情報を取得します。

DB_PASSWORD=$(aws ssm get-parameter \
  --name "/my/webapp/db-password" \
  --query "Parameter.Value" \
  --output text \
  --region ap-northeast-1 \
  --with-decryption)

# setenv.shを作成(RDSエンドポイントは⑩で控えた値に置き換える)
sudo tee /opt/tomcat/bin/setenv.sh << EOF
export DB_HOST=my-webapp-rds-mysql.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
export DB_PASSWORD=$DB_PASSWORD
EOF

sudo chmod +x /opt/tomcat/bin/setenv.sh

内容を確認します。

sudo cat /opt/tomcat/bin/setenv.sh
export DB_HOST=my-webapp-rds-mysql.xxxxx.ap-northeast-1.rds.amazonaws.com
export DB_PASSWORD=(設定したパスワード)

14-3. WARファイルをEC2に転送する

**ローカルの別ターミナル(SSH接続していないターミナル)**で実行します。

scp -i C:\Users\ユーザー名\.ssh\my-webapp-key.pem ^
  C:\(プロジェクトフォルダ)\alb-ec2-rds-webapp\app\target\webapp.war ^
  ec2-user@(EC2のパブリックIP):/home/ec2-user/

転送完了後、SSH接続中のターミナルで確認します。

ls -lh ~/webapp.war

14-4. Tomcatを停止してWARをデプロイする

# Tomcatを停止
sudo /opt/tomcat/bin/shutdown.sh
sleep 3

# 既存のROOTアプリを削除してWARをデプロイ
sudo rm -rf /opt/tomcat/webapps/ROOT /opt/tomcat/webapps/ROOT.war
sudo cp ~/webapp.war /opt/tomcat/webapps/ROOT.war

# Tomcatを起動(setenv.shが読み込まれる)
sudo /opt/tomcat/bin/startup.sh

14-5. デプロイを確認する

Tomcatは ROOT.war を自動展開してアプリを起動します。1〜2分待ってから確認します。

# Tomcatログを確認
sudo tail -50 /opt/tomcat/logs/catalina.out

以下のログが表示されれば成功です。

INFO: Starting ProtocolHandler ["http-nio-8080"]
INFO: Server startup in [XXXX] milliseconds
# EC2内からの疎通確認
curl -s http://localhost:8080/ | head -5

HTMLが返ってくればデプロイ成功です。

exit

⑮ 動作確認

15-1. ALBのヘルスチェック確認

EC2 → ターゲットグループ → my-webapp-tg → 「ターゲット」タブ

EC2のステータスが 「healthy」 になるまで待ちます(Tomcat起動後1〜3分)。

ステータス意味
initialヘルスチェック開始前(少し待つ)
healthy正常(次に進む)
unhealthy異常(⑭のデプロイ手順を確認)

15-2. ALB経由でWebアプリにアクセスする

⑬で控えたALBのDNS名をブラウザで開きます。

http://(ALBのDNS名)

以下の画面が表示されれば成功です。

Spring Boot + RDS Item Manager
ALB → EC2(Tomcat) → RDS MySQL の3層構成で動作しています。
アイテムの追加・削除がRDSに永続化されます。

15-3. アイテムの追加・削除を試す

  1. テキストボックスにアイテム名(例: Apple)を入力して「追加」をクリック
  2. アイテムが一覧に表示されることを確認
  3. 「削除」ボタンでアイテムが削除されることを確認

ブラウザをリロードしてもデータが保持されていれば、RDSへの永続化が成功しています。

15-4. RDSのデータをSQLで直接確認する(任意)

ssh -i C:\Users\ユーザー名\.ssh\my-webapp-key.pem ec2-user@(EC2のパブリックIP)
sudo dnf install -y mariadb105

DB_PASSWORD=$(aws ssm get-parameter \
  --name "/my/webapp/db-password" \
  --query "Parameter.Value" \
  --output text \
  --region ap-northeast-1 \
  --with-decryption)

mysql -h (RDSエンドポイント) -u admin -p"$DB_PASSWORD" sampledb
SELECT * FROM items;
EXIT;

Webアプリで追加したデータが表示されれば完全成功です。

exit

⑯ リソースの削除

課金を止めるために、ハンズオン完了後は必ず削除します。

ALBの課金: インスタンスが稼働中は課金されます(約$0.008/時間 + LCU料金)。

削除順序

1. ALBを削除
2. ターゲットグループを削除
3. EC2インスタンスを終了
4. RDSインスタンスを削除(約10〜15分)
5. RDS DBサブネットグループを削除
6. SSM Parameter Storeのパラメータを削除
7. IAMロールを削除
8. セキュリティグループを削除(RDS用 → EC2用 → ALB用の順)
9. VPCを削除(サブネット・ルートテーブルも一括削除)
10. キーペアを削除(任意)

1. ALBを削除する

EC2 → ロードバランサー → my-webapp-alb を選択 → 「アクション」→「削除」

2. ターゲットグループを削除する

EC2 → ターゲットグループ → my-webapp-tg を選択 → 「アクション」→「削除」

3. EC2インスタンスを終了する

EC2 → インスタンス → my-webapp-ap-instance を選択 → 「インスタンスの状態」→「インスタンスを終了」

4. RDSインスタンスを削除する

Aurora and RDS → データベース → my-webapp-rds-mysql を選択 → 「アクション」→「削除」

項目操作
最終スナップショットを作成チェックを外したまま
「私は〜を了承します。」チェックを入れる
確認フィールドdelete me と入力

5. RDS DBサブネットグループを削除する

Aurora and RDS → サブネットグループ → my-webapp-rds-subnet-group → 「削除」

6. SSM Parameter Storeを削除する

Systems Manager → パラメータストア → /my/webapp/db-password → 「削除」

7. IAMロールを削除する

IAM → ロール → my-webapp-ec2-role を選択 → 「削除」

8. セキュリティグループを削除する

依存関係があるため以下の順番で削除します。

  1. my-webapp-rds-sg
  2. my-webapp-ec2-sg
  3. my-webapp-alb-sg

9. VPCを削除する

VPC → お使いのVPC → my-webapp-vpc を選択 → 「アクション」→「VPCの削除」

VPCを削除するとサブネット・ルートテーブルも一括削除されます。IGWのデタッチが必要な場合は先に行います。

10. キーペアを削除する(任意)

EC2 → キーペア → my-webapp-key を選択 → 「アクション」→「削除」


トラブルシューティング

症状原因対処
ALBに繋がらないTomcatまたはWebアプリが起動していないTGのヘルスチェックステータスを確認
ヘルスチェックがUnhealthyTomcatの起動失敗 or WARのデプロイ失敗sudo tail -50 /opt/tomcat/logs/catalina.out を確認
アクセスはできるが500エラーDB接続失敗(setenv.sh不正)sudo cat /opt/tomcat/bin/setenv.sh でDB_HOSTとDB_PASSWORDを確認
アイテムが保存されないDBに接続できていないcatalina.outにDB接続エラーが出ていないか確認
scp でファイル転送できないSSHが通らないEC2 SGのSSHルール(22番ポート)が自分のIPを許可しているか確認
Tomcat起動失敗(ポート競合)すでにTomcatが動いているsudo /opt/tomcat/bin/shutdown.sh 後に起動し直す
EC2 SGアウトバウンドルール不正Javaインストール・wget失敗EC2 SG → アウトバウンドルールに「すべてのトラフィック 0.0.0.0/0」を追加
ERROR 1049: Unknown databaseRDS作成時にDB名を指定し忘れたMySQLに接続して CREATE DATABASE sampledb; を実行

まとめ

ステップ内容
Mavenで webapp.war をビルド(初回のみ)
①〜⑤VPC / サブネット4つ / IGW / ルートテーブルの設定
3段階のSG(ALB → EC2 → RDS)でSG-to-SG制御
⑦⑧IAMロール + Parameter Store(SecureString)でパスワードを安全に管理
⑨⑩DBサブネットグループ + RDS MySQL 8.0
EC2起動(UserDataでTomcat自動セットアップ)
⑫⑬ターゲットグループ + ALB作成
setenv.shでDB情報を注入 → SCPでWAR転送 → Tomcatにデプロイ
ALB DNS名でアクセス → Spring Boot CRUD画面で動作確認

前回(静的HTML)との最大の違いは、⑭のWARデプロイです。setenv.sh でSSMから取得したDB接続情報を環境変数としてTomcatに渡し、Spring BootアプリがRDS MySQLに接続してCRUD操作できる本格的なWebアプリになりました。

CloudFormationでインフラ構築からWARデプロイまで自動化したい場合は、CloudFormation版ハンズオンを参照してください。S3にWARをアップロードするだけで、UserDataが自動デプロイまで行います。

コメント