はじめに
「EC2のIPが変わるたびに接続先を変えるのは面倒」「EC2を複数台に増やしてトラフィックを分散したい」——これを解決するのが ALB(Application Load Balancer) です。
この記事では、AWSコンソール(GUI)のみを使って、ALB・EC2(Tomcat)・RDS MySQLの3層構成をゼロから手動構築するハンズオンを紹介します。
インターネット
↓ HTTP(80) ← ALB SGで全IPから許可
ALB(my-alb-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-alb-ap-instance)
Tomcat(Javaアプリケーションサーバ)
[パブリックサブネット1: 10.0.1.0/24 AZ-a]
↓ MySQL(3306) ← RDS SGでEC2 SGからのみ許可(SG-to-SG)
RDS MySQL(my-alb-rds-mysql)
[プライベートサブネット1: 10.0.3.0/24 AZ-a]
DBサブネットグループ
├── プライベートサブネット1(10.0.3.0/24)[AZ-a]
└── プライベートサブネット2(10.0.4.0/24)[AZ-c] ← 2AZ必須このハンズオンで体験できること:
- ALBのリスナー・ターゲットグループ・ヘルスチェックの概念を理解
- EC2(Tomcat)をALBの後ろに隠して直接アクセスを遮断する設計
- SG-to-SGを2段階で使う3層制御(インターネット→ALB→EC2→RDS)
- ヘルスチェックで「Healthy」になるまでALBがトラフィックを転送しない仕組みを体験
このハンズオンのポイント:
前フェーズ(EC2 + RDS 2層構成)ではEC2に直接アクセスしていましたが、今回はALBを前段に追加します。ALBのDNS名でアクセスし、EC2のIPアドレスが変わっても影響を受けない設計になります。
この記事は CloudFormation版ハンズオン の比較記事です。
コンソール操作でALB・ターゲットグループ・ヘルスチェックを視覚的に学びたい方向けです。
-->
キーワード解説
| 用語 | 意味 |
|---|---|
| ALB(Application Load Balancer) | HTTP/HTTPSトラフィックをEC2に振り分けるL7ロードバランサー。EC2の死活監視も行う |
| ターゲットグループ | ALBのトラフィック転送先(EC2インスタンスなど)をまとめたグループ |
| リスナー | ALBがトラフィックを受け付けるポート・プロトコルの設定(今回はHTTP:80) |
| ヘルスチェック | ALBがバックエンドEC2に定期的にHTTPリクエストを送り正常性を確認する仕組み。Unhealthyなインスタンスへはトラフィックを転送しない |
| Tomcat | JavaアプリケーションサーバーのOSS実装。デフォルトポート8080 |
| SG-to-SG制御 | セキュリティグループのルールでソースにIPでなく別SGを指定する設定 |
前フェーズとの違い
| 比較項目 | Phase 2-1(EC2 + RDS) | Phase 2-2(ALB + EC2 + RDS)今回 |
|---|---|---|
| アクセス方法 | EC2のパブリックIPに直接アクセス | ALBのDNS名でアクセス |
| Webサーバ | Apache httpd | Tomcat(Java APサーバ) |
| ロードバランシング | なし(EC2 1台) | ALBによるHTTP負荷分散 |
| ヘルスチェック | なし | ALBが定期的にEC2の死活監視 |
| EC2の直接公開 | ポート80で直接公開 | ポート8080はALB SGからのみ許可 |
| サブネット数 | 3つ | 4つ(ALBの2AZ要件のため) |
使用する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は無料枠がありません。ハンズオン後は必ず削除してください。
構築するリソース一覧
| 順序 | リソース | 役割 |
|---|---|---|
| ⓪ | (確認)自分のIPアドレス | SGの設定に使用 |
| ① | キーペア(my-alb-key) | EC2へのSSH認証鍵 |
| ② | VPC(my-alb-vpc) | 独立したネットワーク空間 |
| ③ | サブネット × 4 | パブリック2 + プライベート2 |
| ④ | インターネットゲートウェイ(my-alb-igw) | VPCをインターネットに接続 |
| ⑤ | ルートテーブル × 2 | パブリック/プライベートの通信経路 |
| ⑥ | セキュリティグループ × 3 | ALB用・EC2用・RDS用 |
| ⑦ | IAMロール(my-alb-ec2-role) | EC2がSSM・Parameter Storeを使う権限 |
| ⑧ | SSM Parameter Store | DBパスワードの保管 |
| ⑨ | RDS DBサブネットグループ | RDSを配置できるサブネットを登録 |
| ⑩ | RDS MySQL インスタンス | マネージドDBサーバ(作成に10〜15分) |
| ⑪ | EC2インスタンス(my-alb-ap-instance) | APサーバ(Tomcat) |
| ⑫ | ターゲットグループ(my-alb-tg) | ALBのトラフィック転送先の定義 |
| ⑬ | ALB(my-alb-alb)+ リスナー | ロードバランサー本体 |
| ⑭ | 動作確認 | ALB → EC2 → RDS接続テスト |
| ⑮ | リソース削除 | 課金停止 |
全体の作業順序
⓪ 自分のIPアドレスを確認
↓
① キーペア作成
↓
② VPC作成
↓
③ サブネット作成(4つ)
↓
④ インターネットゲートウェイ作成・アタッチ
↓
⑤ ルートテーブル設定(IGWルート追加 → サブネット関連付け)
↓
⑥ セキュリティグループ作成(ALB用・EC2用・RDS用)
↓
⑦ IAMロール作成
↓
⑧ SSM Parameter Store作成
↓
⑨ RDS DBサブネットグループ作成
↓
⑩ RDS MySQL インスタンス作成(※約10〜15分かかる)
↓
⑪ EC2インスタンス起動(Tomcat)
↓
⑫ ターゲットグループ作成
↓
⑬ ALB作成・リスナー設定
↓
⑭ 動作確認(ALB → EC2 → RDS)
↓
⑮ リソース削除⓪ 自分のIPアドレスの確認
ブラウザで以下のURLを開くか、コマンドで確認します。
https://checkip.amazonaws.com控えておく情報: 自分のIPアドレス(例: 203.0.113.1)
セキュリティグループで
203.0.113.1/32の形式(末尾に/32)で使用します。
① キーペアの作成
AWSコンソール → EC2 → キーペア → 「キーペアを作成」
| 設定項目 | 値 |
|---|---|
| 名前 | my-alb-key |
| キーペアのタイプ | RSA |
| プライベートキーファイル形式 | .pem |
「キーペアを作成」をクリック。ダウンロードされた .pem ファイルを保存します。
C:\Users\ユーザー名\.ssh\my-alb-key.pem② VPCの作成
AWSコンソール → VPC → VPC → 「VPCを作成」
| 設定項目 | 値 |
|---|---|
| 作成するリソース | VPCのみ |
| 名前タグ | my-alb-vpc |
| IPv4 CIDR | 10.0.0.0/16 |
「VPCを作成」をクリック。
③ サブネットの作成(4つ)
AWSコンソール → VPC → サブネット → 「サブネットを作成」
VPCに my-alb-vpc を選択して、以下の4つを1回の操作で作成します(「新しいサブネットを追加」で追加できます)。
| 名前 | AZ | IPv4 CIDR | 用途 |
|---|---|---|---|
my-alb-public-subnet-1 | ap-northeast-1a | 10.0.1.0/24 | ALB + EC2 |
my-alb-public-subnet-2 | ap-northeast-1c | 10.0.2.0/24 | ALB(2AZ必須) |
my-alb-private-subnet-1 | ap-northeast-1a | 10.0.3.0/24 | RDS配置 |
my-alb-private-subnet-2 | ap-northeast-1c | 10.0.4.0/24 | DBサブネットグループ用 |
「サブネットを作成」をクリック。
ALBが2AZを必要とする理由: ALBは高可用性のため複数AZにまたがって配置されます。VPCを選択すると「少なくとも2つのAZのサブネットを指定してください」というバリデーションが入ります。
④ インターネットゲートウェイの作成・アタッチ
作成
AWSコンソール → VPC → インターネットゲートウェイ → 「インターネットゲートウェイを作成」
| 設定項目 | 値 |
|---|---|
| 名前タグ | my-alb-igw |
「インターネットゲートウェイを作成」をクリック。
VPCへのアタッチ
作成したIGWを選択 → 「アクション」→「VPCにアタッチ」→ my-alb-vpc を選択 → 「インターネットゲートウェイのアタッチ」
⑤ ルートテーブルの設定
注意: EC2を起動する前にこの手順を完了させてください。IGWルートがない状態でEC2を起動すると、UserDataのTomcatインストールが失敗します。
5-1. パブリック用ルートテーブル
AWSコンソール → VPC → ルートテーブル → 「ルートテーブルを作成」
| 設定項目 | 値 |
|---|---|
| 名前 | my-alb-public-rt |
| VPC | my-alb-vpc |
作成後、my-alb-public-rt を選択 → 「ルート」タブ → 「ルートを編集」→「ルートを追加」
| 送信先 | ターゲット |
|---|---|
0.0.0.0/0 | インターネットゲートウェイ my-alb-igw |
「変更を保存」をクリック。
次に「サブネットの関連付け」タブ → 「サブネットの関連付けを編集」→ パブリックサブネット2つにチェック → 保存
my-alb-public-subnet-1my-alb-public-subnet-2
5-2. プライベート用ルートテーブル
同様に「ルートテーブルを作成」
| 設定項目 | 値 |
|---|---|
| 名前 | my-alb-private-rt |
| VPC | my-alb-vpc |
「サブネットの関連付けを編集」→ プライベートサブネット2つにチェック → 保存
my-alb-private-subnet-1my-alb-private-subnet-2
⑥ セキュリティグループの作成
6-1. ALB用セキュリティグループ
AWSコンソール → EC2 → セキュリティグループ → 「セキュリティグループを作成」
| 設定項目 | 値 |
|---|---|
| セキュリティグループ名 | my-alb-sg |
| 説明 | ALB SG - HTTP from internet |
| VPC | my-alb-vpc |
インバウンドルール:
| タイプ | ポート | ソース | 説明 |
|---|---|---|---|
| HTTP | 80 | 0.0.0.0/0 | HTTP from internet |
「セキュリティグループを作成」をクリック。
なぜ
0.0.0.0/0(全開放)なのか: これまでのハンズオンではEC2が直接インターネットに露出していたため自分のIPだけに制限していました。今回はEC2の前にALBを置く3層構成のため、不特定多数のユーザーが使うWebサービスの入口であるALBは全開放が正しい設計です。EC2(Tomcat)のセキュリティは次の6-2で設定するEC2 SGの「ALB SGからのみ8080を許可」によって守られます。
6-2. EC2用セキュリティグループ
| 設定項目 | 値 |
|---|---|
| セキュリティグループ名 | my-alb-ec2-sg |
| 説明 | EC2 Tomcat SG - Tomcat:8080 from ALB SG, SSH from MyIP |
| VPC | my-alb-vpc |
インバウンドルール:
| タイプ | ポート | ソース | 説明 |
|---|---|---|---|
| カスタムTCP | 8080 | my-alb-sg(SGを選択) | Tomcat from ALB SG only |
| SSH | 22 | 自分のIP/32 | SSH from my IP |
アウトバウンドルール(変更しない):
| タイプ | プロトコル | 送信先 |
|---|---|---|
| すべてのトラフィック | すべて | 0.0.0.0/0 |
アウトバウンドルールを変更してはいけない理由: EC2がTomcatのインストール(Javaのダウンロードなど)でインターネットにアクセスするために必要です。誤って削除するとEC2からの通信が遮断されます。
SG-to-SG制御: ポート8080のソースにIPアドレスではなく
my-alb-sgのSGを指定します。ALBを経由したトラフィックのみEC2に到達でき、インターネットから直接8080番ポートへのアクセスは不可になります。
6-3. RDS用セキュリティグループ
| 設定項目 | 値 |
|---|---|
| セキュリティグループ名 | my-alb-rds-sg |
| 説明 | RDS MySQL SG - MySQL:3306 from EC2 SG only |
| VPC | my-alb-vpc |
インバウンドルール:
| タイプ | ポート | ソース | 説明 |
|---|---|---|---|
| MySQL/Aurora | 3306 | my-alb-ec2-sg(SGを選択) | MySQL from EC2 SG only |
⑦ IAMロールの作成
AWSコンソール → IAM → ロール → 「ロールを作成」
信頼されたエンティティ
| 設定項目 | 値 |
|---|---|
| 信頼されたエンティティタイプ | AWSのサービス |
| サービス | EC2 |
許可ポリシー
以下の2つのポリシーを検索して追加します。
| ポリシー名 | 用途 |
|---|---|
AmazonSSMManagedInstanceCore | Session Manager接続用 |
AmazonSSMReadOnlyAccess | Parameter Storeからパスワードを読み取る |
ロール名
| 設定項目 | 値 |
|---|---|
| ロール名 | my-alb-ec2-role |
「ロールを作成」をクリック。
⑧ SSM Parameter Storeの作成
AWSコンソール → Systems Manager → パラメータストア → 「パラメータの作成」
| 設定項目 | 値 |
|---|---|
| 名前 | /my/alb/db-password |
| 説明 | RDS MySQL master password for ALB hands-on |
| 層 | スタンダード |
| タイプ | 安全な文字列(SecureString・推奨) |
| KMS キーID | alias/aws/ssm(デフォルト) |
| 値 | Handson1234! |
「パラメータの作成」をクリック。
「安全な文字列」(SecureString)とは: パスワードなどの機密情報をKMSで暗号化して保存するタイプです。取得時は
--with-decryptionオプションが必要です。CloudFormation版はString型で作成しますが、コンソールではSecureStringを推奨します。
⑨ RDS DBサブネットグループの作成
AWSコンソール → Aurora and RDS → サブネットグループ → 「DBサブネットグループの作成」
| 設定項目 | 値 |
|---|---|
| 名前 | my-alb-rds-subnet-group |
| 説明 | RDS subnet group for ALB hands-on |
| VPC | my-alb-vpc |
アベイラビリティーゾーンとサブネットの追加:
| AZ | サブネット |
|---|---|
| ap-northeast-1a | my-alb-private-subnet-1 |
| ap-northeast-1c | my-alb-private-subnet-2 |
「作成」をクリック。
⑩ RDS MySQL インスタンスの作成
AWSコンソール → Aurora and RDS → データベース → 「データベースの作成 ▲」→「フル設定」
注意: RDSの作成は約10〜15分かかります。
エンジンの選択
| 設定項目 | 値 |
|---|---|
| エンジンのタイプ | MySQL |
| エンジンバージョン | MySQL 8.0.x(最新) |
テンプレート
| 設定項目 | 値 |
|---|---|
| テンプレート | 無料利用枠 |
設定
| 設定項目 | 値 |
|---|---|
| DBインスタンス識別子 | my-alb-rds-mysql |
| マスターユーザー名 | admin |
| マスターパスワード | Handson1234! |
インスタンスの設定
| 設定項目 | 値 |
|---|---|
| DBインスタンスクラス | db.t3.micro |
ストレージ
| 設定項目 | 値 |
|---|---|
| ストレージタイプ | 汎用SSD (gp2) |
| 割り当てられたストレージ | 20 GiB |
| ストレージの自動スケーリング | チェックを外す |
接続
| 設定項目 | 値 |
|---|---|
| コンピューティングリソース | EC2コンピューティングリソースに接続しない |
| VPC | my-alb-vpc |
| DBサブネットグループ | my-alb-rds-subnet-group |
| パブリックアクセス | なし |
| VPCセキュリティグループ | 既存の選択 → my-alb-rds-sg(default は削除) |
| アベイラビリティーゾーン | ap-northeast-1a |
追加設定
「追加設定」を開きます。
| 設定項目 | 値 |
|---|---|
| 最初のデータベース名 | sampledb |
| 自動バックアップを有効にする | チェックを外す |
「データベースの作成」をクリック。
控えておく情報: 作成完了後に表示される「エンドポイント」のホスト名
my-alb-rds-mysql.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com⑪ EC2インスタンスの起動
注意: EC2を起動する前に⑤のルートテーブル設定が完了していることを確認してください。IGWルートがない状態で起動するとTomcatのインストールが失敗します。
AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」
基本設定
| 設定項目 | 値 |
|---|---|
| 名前 | my-alb-ap-instance |
| AMI | Amazon Linux 2023 AMI |
| インスタンスタイプ | t2.micro |
| キーペア | my-alb-key |
ネットワーク設定
「編集」をクリックして以下を設定します。
| 設定項目 | 値 |
|---|---|
| VPC | my-alb-vpc |
| サブネット | my-alb-public-subnet-1 |
| パブリックIPの自動割り当て | 有効化 |
| ファイアウォール(セキュリティグループ) | 既存のセキュリティグループを選択 |
| セキュリティグループ | my-alb-ec2-sg |
IAMロール
「高度な詳細」→「IAMインスタンスプロファイル」→ my-alb-ec2-role を選択
UserData
「高度な詳細」→「ユーザーデータ」に以下を貼り付けます。
Tomcatバージョンの確認:
TOMCAT_VERSIONの値は https://archive.apache.org/dist/tomcat/tomcat-10/ で利用可能なバージョンを確認して設定してください。
#!/bin/bash
set -xe
exec > >(tee /var/log/user-data.log) 2>&1
dnf update -y
dnf install -y java-17-amazon-corretto wget
# https://archive.apache.org/dist/tomcat/tomcat-10/
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
# テスト用Webアプリのデプロイ
cat > /opt/tomcat/webapps/ROOT/index.html << 'HTMLEOF'
<!DOCTYPE html>
<html>
<body>
<h1>AP Server - Phase 2-2 ALB + Tomcat + RDS</h1>
<p>This server is load balanced by ALB and connects to RDS MySQL.</p>
</body>
</html>
HTMLEOF
# Tomcat起動
/opt/tomcat/bin/startup.shタグ
| キー | 値 |
|---|---|
Cost | (任意) |
「インスタンスを起動」をクリック。起動完了まで約2〜3分待ちます。
Tomcatの起動について: EC2の「実行中」状態になった後、UserDataによるTomcatのインストール・起動にさらに約5〜10分かかります。ALBのヘルスチェックが「Healthy」になるまで待ってからアクセスしてください。
控えておく情報: インスタンスのパブリックIPアドレス
⑫ ターゲットグループの作成
AWSコンソール → EC2 → ターゲットグループ → 「ターゲットグループの作成」
ターゲットタイプとプロトコル
| 設定項目 | 値 |
|---|---|
| ターゲットタイプ | インスタンス |
| ターゲットグループ名 | my-alb-tg |
| プロトコル | HTTP |
| ポート | 8080 |
| VPC | my-alb-vpc |
| プロトコルバージョン | HTTP1 |
ヘルスチェック
| 設定項目 | 値 |
|---|---|
| ヘルスチェックプロトコル | HTTP |
| ヘルスチェックパス | / |
「次へ」をクリック。
ターゲットの登録
「使用可能なインスタンス」から my-alb-ap-instance を選択します。
| 設定項目 | 値 |
|---|---|
| ポート | 8080 |
「保留中として以下を含める」をクリック → 下部の「ターゲットを確認」にインスタンスが表示されたことを確認して「次へ」をクリック。
「ターゲットグループの作成」をクリック。
ヘルスチェックとは: ALBが定期的にEC2のポート8080の
/にHTTPリクエストを送り、正常(HTTP 200)が返るか確認する仕組みです。ステータスが「Healthy」になるまではALBはそのEC2にトラフィックを転送しません。
⑬ ALBの作成・リスナー設定
AWSコンソール → EC2 → ロードバランサー → 「ロードバランサーの作成」
「Application Load Balancer」の「作成」をクリック。
基本的な設定
| 設定項目 | 値 |
|---|---|
| ロードバランサー名 | my-alb-alb |
| スキーム | インターネット向け |
| IPアドレスタイプ | IPv4 |
ネットワークマッピング
| 設定項目 | 値 |
|---|---|
| VPC | my-alb-vpc |
| アベイラビリティーゾーン | ap-northeast-1a(my-alb-public-subnet-1)と ap-northeast-1c(my-alb-public-subnet-2)の両方を選択 |
ALBは必ず2つ以上のAZを選択します。 1つのAZだけを選ぶとエラーになります。
セキュリティグループ
my-alb-sg のみを選択(デフォルトSGは削除)。
リスナーとルーティング
| 設定項目 | 値 |
|---|---|
| プロトコル | HTTP |
| ポート | 80 |
| デフォルトアクション | my-alb-tg に転送 |
「ロードバランサーの作成」をクリック。
控えておく情報: 「DNS名」(例: my-alb-alb-1234567890.ap-northeast-1.elb.amazonaws.com)
⑭ 動作確認
14-1. ALBのヘルスチェック確認
EC2 → ターゲットグループ → my-alb-tg → 「ターゲット」タブ
my-alb-ap-instance のステータスが 「Healthy」 になるまで待ちます(5〜10分)。
| ステータス | 意味 |
|---|---|
initial | 初期ヘルスチェック中(待つ) |
healthy | 正常(トラフィック転送される) |
unhealthy | 異常(Tomcatが起動していない可能性) |
unhealthyが続く場合はEC2にSSH接続してsudo cat /var/log/user-data.logでUserDataのエラーを確認してください。
14-2. ALB経由でWebアクセス確認
ブラウザで以下のURLにアクセスします。
http://(⑬で控えたALBのDNS名)「AP Server - Phase 2-2 ALB + Tomcat + RDS」と表示されれば正常です。
EC2のパブリックIPに直接アクセスしても表示されません(ポート8080はALB SGからのみ許可しているため)。これが3層構成のポイントです。
14-3. EC2にSSH接続する
ssh -i C:\Users\ユーザー名\.ssh\my-alb-key.pem ec2-user@(EC2パブリックIP)14-4. Parameter StoreからDBパスワードを取得する
aws ssm get-parameter \
--name "/my/alb/db-password" \
--query "Parameter.Value" \
--output text \
--region ap-northeast-1 \
--with-decryptionHandson1234! と表示されれば成功です。
--with-decryptionについて: コンソールでSecureStringとして作成した場合は必須です。このフラグがないと暗号化されたままの文字列が返ってきます。
14-5. RDSへのMySQL接続テスト
MySQLクライアントをインストールします(Amazon Linux 2023では mariadb105 を使います)。
sudo dnf install -y mariadb105# 変数にエンドポイントを代入(⑩で控えた値に置き換える)
RDS_ENDPOINT="my-alb-rds-mysql.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"
# Parameter StoreからDBパスワードを取得して接続
DB_PASSWORD=$(aws ssm get-parameter \
--name "/my/alb/db-password" \
--query "Parameter.Value" \
--output text \
--region ap-northeast-1 \
--with-decryption)
mysql -h $RDS_ENDPOINT -u admin -p"$DB_PASSWORD" sampledb接続成功後、SQL操作を確認します。
-- テーブル作成
CREATE TABLE items (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- データ挿入
INSERT INTO items (name) VALUES ('Apple'), ('Banana');
-- データ確認
SELECT * FROM items;
-- 後片付け
DROP TABLE items;
EXIT;14-6. SSH接続を切断する
exit⑮ リソースの削除
課金を止めるために、ハンズオン完了後は必ず削除します。
ALBの課金について: ALBはインスタンスが稼働している間は課金されます(約$0.008/時間 + LCU料金)。不要になったら必ず削除してください。
削除順序
依存関係があるため、必ずこの順番で削除します。
1. ALBを削除
2. ターゲットグループを削除
3. EC2インスタンスを終了
4. RDSインスタンスを削除(約10〜15分)
5. RDS DBサブネットグループを削除
6. SSM Parameter Storeのパラメータを削除
7. セキュリティグループを削除(RDS用 → EC2用 → ALB用の順)
8. ルートテーブルの関連付け解除・削除
9. インターネットゲートウェイをデタッチ・削除
10. サブネットを削除(4つ)
11. VPCを削除
12. IAMロールを削除
13. キーペアを削除(任意)1. ALBを削除する
EC2 → ロードバランサー → my-alb-alb を選択 → 「アクション」→「削除」
確認フィールドに 確認 と入力 → 「削除」をクリック。
ALBを削除するとリスナーも一緒に削除されます。
2. ターゲットグループを削除する
EC2 → ターゲットグループ → my-alb-tg を選択 → 「アクション」→「削除」
3. EC2インスタンスを終了する
EC2 → インスタンス → my-alb-ap-instance を選択 → 「インスタンスの状態」→「インスタンスを終了」
「終了済み」になるまで待ちます(2〜5分)。
4. RDSインスタンスを削除する
Aurora and RDS → データベース → my-alb-rds-mysql を選択 → 「アクション」→「削除」
| 項目 | 操作 |
|---|---|
| 最終スナップショットを作成 | チェックを外したまま |
| 「私は〜を了承します。」 | チェックを入れる |
| 確認フィールド | delete me と入力 |
「削除」をクリック。削除完了まで約10〜15分かかります。
5. RDS DBサブネットグループを削除する
Aurora and RDS → サブネットグループ → my-alb-rds-subnet-group → 「削除」
RDSインスタンスが完全に削除されてから行います。
6. SSM Parameter Storeのパラメータを削除する
Systems Manager → パラメータストア → /my/alb/db-password → 「削除」
7. セキュリティグループを削除する
EC2 → セキュリティグループ
依存関係があるため以下の順番で削除します。
my-alb-rds-sg→ 「アクション」→「セキュリティグループを削除」my-alb-ec2-sg→ 「アクション」→「セキュリティグループを削除」my-alb-sg→ 「アクション」→「セキュリティグループを削除」
8. ルートテーブルを削除する
VPC → ルートテーブル
my-alb-public-rt→ 「サブネットの関連付け」→「編集」→ チェックを全て外す → 「保存」→「アクション」→「ルートテーブルの削除」my-alb-private-rt→ 同様に操作
9. インターネットゲートウェイをデタッチ・削除する
VPC → インターネットゲートウェイ
my-alb-igwを選択 → 「アクション」→「VPCからデタッチ」→「デタッチ」- 「アクション」→「インターネットゲートウェイの削除」
10. サブネットを削除する(4つ)
VPC → サブネット
4つのサブネットをすべて選択 → 「アクション」→「サブネットの削除」
my-alb-public-subnet-1my-alb-public-subnet-2my-alb-private-subnet-1my-alb-private-subnet-2
11. VPCを削除する
VPC → お使いのVPC → my-alb-vpc を選択 → 「アクション」→「VPCの削除」
12. IAMロールを削除する
IAM → ロール → my-alb-ec2-role を選択 → 「削除」
13. キーペアを削除する(任意)
EC2 → キーペア → my-alb-key を選択 → 「アクション」→「削除」
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
| ALBに繋がらない(タイムアウト) | ALB SGのインバウンドルールにHTTP:80がない | ALB SGを確認・修正 |
| ALBに繋がるが502エラー | TomcatがまだEC2で起動していない | 5〜10分待つか sudo cat /var/log/user-data.log 確認 |
| ALBに繋がるが503エラー | ターゲットグループにHealthyなインスタンスがない | TG → ターゲットのステータスを確認 |
| Unhealthyが続く | Tomcatの起動失敗 | SSH接続して sudo /opt/tomcat/bin/startup.sh を手動実行 |
| Unhealthyが続く(UserDataも失敗) | EC2 SGのアウトバウンドルールが削除されている | EC2 SG → アウトバウンドルールに「すべてのトラフィック 0.0.0.0/0」を追加 |
| EC2にSSH接続できない | SGのSSH許可IPが違う | EC2 SGのインバウンドSSH規則を現在のIPに更新 |
| MySQLに接続できない | RDS SGのソースがEC2 SGのIDでない | RDS SGのインバウンドルールを確認 |
ERROR 1049: Unknown database 'sampledb' | RDS作成時にDB名を指定し忘れた | MySQLに接続して CREATE DATABASE sampledb; を実行 |
まとめ
| ステップ | 内容 |
|---|---|
| ①〜⑤ | VPC / サブネット4つ / IGW / ルートテーブルの設定 |
| ⑥ | 3段階のSG(ALB SG → EC2 SG → RDS SG)でSG-to-SG制御 |
| ⑦⑧ | IAMロール + Parameter Store(SecureString)でパスワードを安全に管理 |
| ⑨⑩ | DBサブネットグループ + RDS MySQL 8.0 |
| ⑪ | EC2起動(UserDataでTomcat自動セットアップ) |
| ⑫⑬ | ターゲットグループ + ALB作成。Healthyになるまで待つ |
| ⑭ | ALB DNS名でアクセス → EC2 → Parameter Store → RDS への接続テスト |
前フェーズ(EC2 + RDS)との最大の違いは、EC2がインターネットに直接露出しない点です。ALBがHTTP:80のトラフィックを受け取り、EC2にはALBを経由したポート8080のみが開放されています。スケールアウト時はターゲットグループにEC2を追加するだけで負荷分散できます。
CloudFormationで同じ構成を自動化したい場合は、CloudFormation版ハンズオンを参照してください。コマンド1本で27リソースを一括デプロイできます。
コメント