- はじめに
- キーワード解説
- 前フェーズとの違い
- 使用するAWSサービス
- 構築するリソース一覧
- 全体の作業順序
- ⓪ Webアプリのビルド
- ⓪-2 自分のIPアドレスの確認
- ① キーペアの作成
- ② VPCの作成
- ③ サブネットの作成(4つ)
- ④ インターネットゲートウェイの作成・アタッチ
- ⑤ ルートテーブルの設定
- ⑥ セキュリティグループの作成
- ⑦ IAMロールの作成
- ⑧ SSM Parameter Storeの作成
- ⑨ RDS DBサブネットグループの作成
- ⑩ RDS MySQL インスタンスの作成
- ⑪ EC2インスタンスの起動(Tomcat)
- ⑫ ターゲットグループの作成
- ⑬ ALBの作成・リスナー設定
- ⑭ Webアプリのデプロイ
- ⑮ 動作確認
- ⑯ リソースの削除
- トラブルシューティング
- まとめ
はじめに
前回の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-handsonAWS HANDSON. Contribute to caymezon/aws-handson development by creating an account on GitHub.
この記事は CloudFormation版ハンズオン の比較記事です。
コンソール操作でWARのデプロイ手順を手を動かして確認したい方向けです。
-->
キーワード解説
| 用語 | 意味 |
|---|---|
| Spring Boot | Javaの代表的なWebアプリフレームワーク。設定ファイルを最小限にしてWebアプリを素早く作れる |
| Maven | Javaのビルドツール。mvn package でWARファイルを生成する |
| WAR(Web Application Archive) | JavaのWebアプリをTomcatにデプロイするためのパッケージ形式 |
| JdbcTemplate | Spring FrameworkのDB操作クラス。SQLを直接書いてDBを操作できる |
| Thymeleaf | Spring Bootで使われるHTMLテンプレートエンジン |
| SCP | SSH経由でファイルを転送するコマンド。scp でWARをEC2に送る |
| setenv.sh | Tomcatが起動時に読み込むシェルスクリプト。環境変数を設定して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 Store | DBパスワードの安全な保管 | スタンダード層は無料 |
| IAM | EC2にSSM・Parameter Store権限を付与 | 無料 |
注意: ALBは無料枠がありません。ハンズオン後は必ず削除してください。
構築するリソース一覧
| 順序 | リソース | 役割 |
|---|---|---|
| ⓪ | (前提)Webアプリのビルド | webapp.war の生成 |
| ⓪-2 | 自分のIPアドレスの確認 | SGのSSHルール設定に使用 |
| ① | キーペア(my-webapp-key) | EC2へのSSH・SCP認証鍵 |
| ② | VPC(my-webapp-vpc) | 独立したネットワーク空間 |
| ③ | サブネット × 4 | パブリック2 + プライベート2 |
| ④ | インターネットゲートウェイ(my-webapp-igw) | VPCをインターネットに接続 |
| ⑤ | ルートテーブル × 2 | パブリック/プライベートの通信経路 |
| ⑥ | セキュリティグループ × 3 | ALB用・EC2用・RDS用 |
| ⑦ | IAMロール(my-webapp-ec2-role) | EC2がSSM・Parameter Storeを使う権限 |
| ⑧ | SSM Parameter Store(/my/webapp/db-password) | DBパスワードの保管 |
| ⑨ | RDS DBサブネットグループ | RDSを配置できるサブネットを登録 |
| ⑩ | RDS MySQL インスタンス(my-webapp-rds-mysql) | マネージドDBサーバ(作成に10〜15分) |
| ⑪ | EC2インスタンス(my-webapp-ap-instance) | APサーバ(Tomcat) |
| ⑫ | ターゲットグループ(my-webapp-tg) | ALBのトラフィック転送先の定義 |
| ⑬ | 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-handsonAWS HANDSON. Contribute to caymezon/aws-handson development by creating an account on GitHub.
GitHubからクローンするか、ローカルにすでにあるソースコードを使います。
ビルド前の確認:
java -version
mvn -versionJava 17以上、Maven 3.x が表示されることを確認します。
WARファイルをビルドする:
cd C:\(プロジェクトフォルダ)\alb-ec2-rds-webapp\app
mvn package -DskipTests-DskipTests はローカルにDBがないためテストをスキップします。初回は依存ライブラリのダウンロードで数分かかります。
[INFO] BUILD SUCCESSビルド成果物を確認する:
dir target\webapp.warwebapp.war(約20〜30MB)が生成されていれば成功です。
アプリの機能: アイテム一覧表示・追加・削除の3機能。Spring Boot + JdbcTemplate + Thymeleaf で構成されています。DB接続情報は環境変数(
DB_HOST・DB_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 CIDR | 10.0.0.0/16 |
「VPCを作成」をクリック。
③ サブネットの作成(4つ)
AWSコンソール → VPC → サブネット → 「サブネットを作成」
VPCに my-webapp-vpc を選択して、以下の4つを1回の操作で作成します(「新しいサブネットを追加」で追加できます)。
| 名前 | AZ | IPv4 CIDR | 用途 |
|---|---|---|---|
my-webapp-public-subnet-1 | ap-northeast-1a | 10.0.1.0/24 | ALB + EC2 |
my-webapp-public-subnet-2 | ap-northeast-1c | 10.0.2.0/24 | ALB(2AZ必須) |
my-webapp-private-subnet-1 | ap-northeast-1a | 10.0.3.0/24 | RDS配置 |
my-webapp-private-subnet-2 | ap-northeast-1c | 10.0.4.0/24 | DBサブネットグループ用 |
「サブネットを作成」をクリック。
パブリックサブネットのIPv4自動割り当てを有効化
my-webapp-public-subnet-1 と my-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 |
| VPC | my-webapp-vpc |
作成後、「ルート」タブ → 「ルートを編集」→「ルートを追加」
| 送信先 | ターゲット |
|---|---|
0.0.0.0/0 | インターネットゲートウェイ my-webapp-igw |
「変更を保存」をクリック。
「サブネットの関連付け」タブ → 「サブネットの関連付けを編集」→ パブリックサブネット2つにチェック → 保存
my-webapp-public-subnet-1my-webapp-public-subnet-2
5-2. プライベート用ルートテーブル
| 設定項目 | 値 |
|---|---|
| 名前 | my-webapp-private-rt |
| VPC | my-webapp-vpc |
「サブネットの関連付けを編集」→ プライベートサブネット2つにチェック → 保存
my-webapp-private-subnet-1my-webapp-private-subnet-2
⑥ セキュリティグループの作成
6-1. ALB用セキュリティグループ
AWSコンソール → EC2 → セキュリティグループ → 「セキュリティグループを作成」
| 設定項目 | 値 |
|---|---|
| セキュリティグループ名 | my-webapp-alb-sg |
| 説明 | ALB SG - HTTP:80 from internet |
| VPC | my-webapp-vpc |
インバウンドルール:
| タイプ | ポート | ソース | 説明 |
|---|---|---|---|
| HTTP | 80 | 0.0.0.0/0 | HTTP 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 |
| VPC | my-webapp-vpc |
インバウンドルール:
| タイプ | ポート | ソース | 説明 |
|---|---|---|---|
| カスタムTCP | 8080 | my-webapp-alb-sg(SGを選択) | Tomcat from ALB SG only |
| SSH | 22 | 自分のIP/32 | SSH 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 |
| VPC | my-webapp-vpc |
インバウンドルール:
| タイプ | ポート | ソース | 説明 |
|---|---|---|---|
| MySQL/Aurora | 3306 | my-webapp-ec2-sg(SGを選択) | MySQL from EC2 SG only |
⑦ IAMロールの作成
AWSコンソール → IAM → ロール → 「ロールを作成」
信頼されたエンティティ
| 設定項目 | 値 |
|---|---|
| 信頼されたエンティティタイプ | AWSのサービス |
| サービス | EC2 |
許可ポリシー
| ポリシー名 | 用途 |
|---|---|
AmazonSSMManagedInstanceCore | Session Manager接続用 |
AmazonSSMReadOnlyAccess | Parameter 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 キーID | alias/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 |
| VPC | my-webapp-vpc |
アベイラビリティーゾーンとサブネットの追加:
| AZ | サブネット |
|---|---|
| ap-northeast-1a | my-webapp-private-subnet-1 |
| ap-northeast-1c | my-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コンピューティングリソースに接続しない |
| VPC | my-webapp-vpc |
| DBサブネットグループ | my-webapp-rds-subnet-group |
| パブリックアクセス | なし |
| VPCセキュリティグループ | 既存の選択 → my-webapp-rds-sg(default は削除) |
| アベイラビリティーゾーン | ap-northeast-1a |
追加設定
「追加設定」を開きます。
| 設定項目 | 値 |
|---|---|
| 最初のデータベース名 | sampledb |
| 自動バックアップを有効にする | チェックを外す |
「データベースの作成」をクリック。
控えておく情報: 作成完了後の「エンドポイント」ホスト名
my-webapp-rds-mysql.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com⑪ EC2インスタンスの起動(Tomcat)
注意: EC2を起動する前に⑤のルートテーブル設定が完了していることを確認してください。
AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」
基本設定
| 設定項目 | 値 |
|---|---|
| 名前 | my-webapp-ap-instance |
| AMI | Amazon Linux 2023 AMI |
| インスタンスタイプ | t2.micro |
| キーペア | my-webapp-key |
ネットワーク設定
「編集」をクリックして以下を設定します。
| 設定項目 | 値 |
|---|---|
| VPC | my-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 |
| VPC | my-webapp-vpc |
| プロトコルバージョン | HTTP1 |
ヘルスチェック
| 設定項目 | 値 |
|---|---|
| ヘルスチェックプロトコル | HTTP |
| ヘルスチェックパス | / |
「次へ」をクリック。
ターゲットの登録
一覧から my-webapp-ap-instance を選択 → ポートが 8080 であることを確認 → 「保留中として以下を含める」をクリック → 「ターゲットグループの作成」
⑬ ALBの作成・リスナー設定
AWSコンソール → EC2 → ロードバランサー → 「ロードバランサーの作成」
「Application Load Balancer」の「作成」をクリック。
基本的な設定
| 設定項目 | 値 |
|---|---|
| ロードバランサー名 | my-webapp-alb |
| スキーム | インターネット向け |
| IPアドレスタイプ | IPv4 |
ネットワークマッピング
| 設定項目 | 値 |
|---|---|
| VPC | my-webapp-vpc |
| アベイラビリティーゾーン | ap-northeast-1a(my-webapp-public-subnet-1)と ap-northeast-1c(my-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_HOST と DB_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.shexport 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.war14-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.sh14-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 -5HTMLが返ってくればデプロイ成功です。
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. アイテムの追加・削除を試す
- テキストボックスにアイテム名(例:
Apple)を入力して「追加」をクリック - アイテムが一覧に表示されることを確認
- 「削除」ボタンでアイテムが削除されることを確認
ブラウザをリロードしてもデータが保持されていれば、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" sampledbSELECT * 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. セキュリティグループを削除する
依存関係があるため以下の順番で削除します。
my-webapp-rds-sgmy-webapp-ec2-sgmy-webapp-alb-sg
9. VPCを削除する
VPC → お使いのVPC → my-webapp-vpc を選択 → 「アクション」→「VPCの削除」
VPCを削除するとサブネット・ルートテーブルも一括削除されます。IGWのデタッチが必要な場合は先に行います。
10. キーペアを削除する(任意)
EC2 → キーペア → my-webapp-key を選択 → 「アクション」→「削除」
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
| ALBに繋がらない | TomcatまたはWebアプリが起動していない | TGのヘルスチェックステータスを確認 |
| ヘルスチェックがUnhealthy | Tomcatの起動失敗 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 database | RDS作成時に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が自動デプロイまで行います。
コメント