ALB → EC2 → RDS のWebシステム構成を構築してみました。
✅ はじめに
はじめてAWS上でWebシステム構成(ALB → EC2 → RDS)を構築したので
手順と学んだポイントを復習も兼ねてまとめてみました。
- 構築経験を積む目的(可視化しやすい構成)
- NAT Gatewayあり(SSMログイン対応)
- Webアプリは表示しない構成(導通確認メイン)
🧱 構成図
ALB (Public Subnet)
↓
EC2 (Private Subnet)
↓
RDS (同じPrivate Subnet)
🧪 最終的な導通確認ポイント
| 経路 | 確認内容 |
|---|---|
| ALB → EC2 | HTTPアクセスで Hello from<hostname> を確認 |
| EC2 → RDS | SSMログインして MySQL クライアントで接続確認 |
🌐 VPCとサブネット作成
| 名称 | CIDR | 用途 | 備考 |
|---|---|---|---|
| VPC | 10.0.0.0/16 |
全体ネットワーク | |
| Public Subnet A/C |
10.0.0.0/24 / 10.0.1.0/24
|
ALB | IGW接続あり |
| Private Subnet A/C |
10.0.10.0/24 / 10.0.11.0/24
|
EC2 & RDS共用 | NAT Gateway経由で外部通信可能 |
📡 NAT Gateway作成(SSMログインのため)
- Public Subnet に NAT Gateway を設置
- Elastic IP を割当
- Private Subnet のルートテーブルに
0.0.0.0/0 → NAT Gatewayを追加
🔁 ルートテーブル作成
| ルートテーブル | 関連付けサブネット | 設定 |
|---|---|---|
| PublicRT | Public Subnet A/C | 0.0.0.0/0 → IGW |
| PublicRT | Public Subnet A/C | 10.0.0.0/16 → local |
| PrivateRT | Private Subnet A/C | 0.0.0.0/0 → NGW |
| PrivateRT | Private Subnet A/C | 10.0.0.0/16 → local |
🔐 セキュリティグループ設定
3つ作成
インバウンド
| SG名 | 許可内容 | 備考 |
|---|---|---|
| ALB-SG | TCP 80 from 0.0.0.0/0 | 公開 |
| EC2-SG | TCP 80 from ALB-SG | ALB経由のみ許可 |
| RDS-SG | TCP 3306 from EC2-SG | DB接続用 |
アウトバウンド(デフォルト)
| SG名 | 許可内容 | 備考 |
|---|---|---|
| 全てのSG | すべてのトラフィック 80 from 0.0.0.0/0 | 公開 |
🛠️ EC2構築(UserDataあり)
AMI:Amazon Linux 2023
インスタンスタイプ:t3.micro
Subnet:Private Subnet A または C
パブリックIPなし
インスタンスプロファイル:AmazonSSMManagedInstanceCore をアタッチ
(SSMログイン用 IAMロール)
UserDataを記入↓
🔧 EC2 UserData 内容(Amazon Linux 2023)
Amazon Linux 2023 では yum install mysql が利用できないため、
(yumコマンドとmysqlコマンドが、OS起動そのままでは使用不可)
代わりに MariaDB クライアントをインストールしました。
RDSの作成画面ではMySQLを選択。
#!/bin/bash
dnf update -y
dnf install -y httpd mariadb105
systemctl start httpd
systemctl enable httpd
echo "Hello from $(hostname)" > /var/www/html/index.html
ALB → EC2 (Apache) → HTML表示
📦 UserData 実行結果(cloud-init)
EC2に設定したUserDataが正常に動いているか確認
Apache & MariaDB パッケージのインストールログ(抜粋):
sudo cat /var/log/cloud-init-output.log
#(抜粋)
Installed:
httpd-2.4.62-1.amzn2023.x86_64
mariadb105-10.5.29-1.amzn2023.0.1.x86_64
...
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
🔍 EC2 内部確認(SSM接続にて)
Apache のステータス:
$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running)
index.html 内容:
$ cat /var/www/html/index.html
Hello from ip-10-0-10-250 #(ここはhostnameが表示される)
#表示されるhostnameを変えて遊びたい人向け
sudo hostnamectl set-hostname 新しいホスト名
🌐 ALB経由アクセス確認
ALBのDNS名:
ALBのDNS名をブラウザで検索
アクセス結果(ブラウザまたは curlコマンド):
→ ApacheサーバーがALB経由で正しく応答していることを確認。
✅ 確認完了ポイント
- EC2起動時にUserDataが実行され、ApacheとMariaDBがインストール
- httpdサービスが有効・起動状態
-
index.htmlが
/var/www/html/に生成済み - ALBからのHTTPアクセスでindex.htmlの内容が確認できた
RDSの作成(詳細手順)
🔸 ステップ 1:DBサブネットグループの作成
AWSコンソール → RDS → サブネットグループ
「サブネットグループの作成」
名前:おまかせ
VPC:VPCを選択
サブネット:Private Subnet A/C を追加
🔸 ステップ 2:RDSインスタンスの作成
AWSコンソール → RDS → 「データベースを作成」
スタンダード作成を選択
エンジン:MySQL
バージョン:任意(例:8.0系)
テンプレート:開発/テスト
設定
DB識別子:おまかせ
マスターユーザー名:admin
・
・
・いくつかの項目はデフォルト
接続
EC2 コンピューティングリソースに接続しないを選択し
作成済みのVPCを選択
サブネットグループ:ステップ1で作成したもの
パブリックアクセス:オフ
VPCセキュリティグループ:(作成済みのセキュリティグループを選択)

ストレージやバックアップ等は任意で調整
「データベースの作成」で完了
✅ 疎通確認(EC2 → RDS)
以下コマンドで RDS(MySQL)への接続確認を行いました。
EC2にSSMログインして実施
# EC2にSSMログイン後
mysql -h <RDSエンドポイント> -u admin -p
SHOW DATABASES;
出力結果
🔻 リソース削除リスト
本構成はAWS料金が時間単位またはストレージ単位で発生するリソースを含むため、検証完了後は不要リソースを削除・解放することでコストの最小化を図ります。
✅ 削除・解放が必要なリソース一覧
| リソース | 削除理由・メモ |
|---|---|
| NAT Gateway | 高額な時間単位・データ転送量課金が発生。使っていなければ即削除が必須。 |
| RDS インスタンス | 常時課金されるマネージドサービス。検証終了後は削除 or スナップショット取得後削除。 |
| RDS スナップショット | ストレージ課金あり。 |
| EC2 インスタンス | 停止中でもEBS料金が発生。不要であれば削除。 |
| Elastic IP (EIP) | アタッチされていないと料金が発生。使用中でなければ解放する。 |
| ALB(ロードバランサー) | 稼働時間とリクエスト数で課金。 |
| ターゲットグループ | ALBと同様に削除。 |
| IAM ロール(EC2用SSM) |
AmazonSSMManagedInstanceCoreなど。他用途と兼用でなければ削除検討。 |
💡 任意で整理(課金はされない)
| リソース | |
|---|---|
| VPC・サブネット | セキュリティグループ |
| サブネットグループ(RDS用) | ルートテーブルなど |
★構成メモ
-
構成簡素化のため、Webサーバー(EC2)とデータベース(RDS)は同一のプライベートサブネットに配置
-
NAT Gatewayは1つのみ作成し、複数のプライベートサブネットから共通で利用する構成としました。可用性を高めるには、各AZにNAT Gatewayを1つずつ配置し、ルートテーブルもAZごとに分ける必要があります。
-
通信信経路は基本インバウンドを記入
-
RDSパブリックアクセス無効(非公開)にしていれば、外部からアクセスできない
RDSから外部に出ていくこともない(パッチ適用時以外)
なので、同じサブネット内のルートテーブルに 0.0.0.0/0 → NAT GW があっても、セキュリティ的に大きなリスクにはならない。 -
SSMログインを可能にするための条件
EC2に必要な3つの準備(これをすべて満たせばOK)
| 項目 | 内容 | 状態 |
|---|---|---|
| IAMロールのアタッチ | AmazonSSMManagedInstanceCore | ポリシー付きのロール ✅ 必須 |
| SSM Agentのインストール | Amazon Linux 2/2023 なら最初から入ってる | ✅ 通常OK |
| SSMと通信できる経路 | インターネット接続 or VPCエンドポイント |
書簡
・自分で構成してみて、
ターゲットグループがunhealthy状態になったり、
UserDataが正常に実行されなかったり
EC2からSSM接続ができなかったりと上手くいかない場面がありました。
しかし、解決まで考えることで多くの知見を得られよかったです。
(生成AIに感謝)
📝 最後に
今後はこの構成をベースに:
- Webアプリ付きの構成
- CloudFormation / Terraform 化
- サーバレス版への展開
Lambda + API Gateway + RDS(MySQL)でRDSの中を見る構成
なども取り組んでいきたいです。
githubにも投稿しました。
https://github.com/biginfranner/AWS_otamesi_alb_ec2_rds



