目次Category
はじめに
こんにちは、26卒の仲山です。
本記事では、下図のような構成でWeb上で動くTodoアプリ作成について解説します。

本記事の目標
今回は、EC2 + RDSでWeb上で動くTodoアプリを作成します。
本記事の目標は以下の通りです。
・Amazon RDS(Aurora)の基本的な利用方法を理解する
・パブリックサブネットにEC2、プライベートサブネットにデータベースを配置するセキュアなネットワーク設計を理解する
※本番環境では、EC2もプライベートサブネットに配置します。
・Webアプリ(EC2)から安全にデータベース(Aurora)へ接続・連携させる方法を身につける
使用するAWSサービス
EC2
・AWS上で利用できる仮想サーバー
・用途に合わせてCPU、メモリ、ストレージなどのスペックを自由に指定できる
Aurora and RDS
・AWSが提供してるマネージド型のリレーショナルデータベースサービス
・MySQL、Oracle、MariaDBなどのデータベースエンジンを使用できる
・今回は、AWSがクラウド向けに独自開発した高パフォーマンスな分散型データベースエンジンであるAuroraを使用します
VPC
・AWS上で仮想ネットワークを構築できるサービス
・サブネット(パブリック/プライベート)に分割して、セキュリティを考慮した安全なシステム配置が可能
それでは早速構築してみましょう!
構築手順
本記事では、義田さんの記事で扱われているEC2インスタンス、VPC及びVPCリソースの作成、EC2インスタンスへのHTTPサーバーのインストールおよび設定を終えていることを前提としています。
もし、作成していない場合は以下の記事を参照して作成してください。
URL: https://www.yaz.co.jp/tec-blog/cloud-basis/aws/3651
1.VPCリソースの作成
今回はRDS用のプライベートサブネットとセキュリティグループを作成します。
プライベートサブネットの作成
プライベートサブネットは以下の設定で作成してください。
VPC
– VPC ID: 自身のVPC
サブネット1の設定
– サブネット名: todoapp-prod-private-<name>-01(任意)
– アベイラビリティゾーン: ap-northeast-1a(東京)
– IPv4 サブネット CIDR ブロック: 10.0.0.32/28
※既に使用している場合は、別の CIDR ブロックを割り当ててください
サブネット2の設定
– サブネット名: todoapp-prod-private-<name>-02(任意)
– アベイラビリティゾーン: ap-northeast-1c(東京)
– IPv4 サブネット CIDR ブロック: 10.0.0.48/28
※既に使用している場合は、別の CIDR ブロックを割り当ててください

EC2用セキュリティグループの作成
– セキュリティグループ名: todoapp-prod-sg-db-ec2-<name>-01
– 説明: 任意の内容で記入
– VPC: 自身のものを選択

特にルールは追加せずにそのまま作成します。
後ほど、作成したセキュリティグループをEC2インスタンスに追加します。
RDS用セキュリティグループの作成
基本的な詳細
– セキュリティグループ名: todoapp-prod-sg-rds-<name>-01
– 説明: 任意の内容で記入
– VPC: 自身のものを選択
インバウンドルール
– タイプ: MySQL/Aurora
– ソース: 先ほどEC2用に作成したセキュリティグループを選択

このセキュリティグループはRDSに追加します。
2.DB サブネットグループを作成
次に、DB サブネットグループを作成していきます。
DB サブネットグループは以下の設定で作成してください。
DB サブネットグループを作成
サブネットグループの詳細
– 名前: todoapp-prod-rds-sgp-<name>-01
– 説明: 任意の内容で記入
– VPC: 自身のものを選択
サブネットを追加
アベイラビリティゾーン:
・東京: ap-northeast-1a、ap-northeast-1c
※画像は大阪リージョンのものになっています
サブネット: todoapp-prod-private-subnet-<name>-01 と todoapp-prod-private-subnet-<name>-02 を選択

3.RDSの作成
次に、RDSを作成していきます
データベースは以下の設定で作成してください。
データベースの作成
エンジンのオプション
– Aurora(MySQL Compatible)を選択
データベース作成方法を選択
– フル設定
テンプレート
– 開発/テスト
クラスタースケーラビリティタイプ
– プロビジョニング済み
– プロビジョニングされた設定のタイプ: バースト可能クラス
– インスタンスタイプ: db.t3.medium
設定
– エンジンバージョン: AuroraMySQL3.10.3
– DB クラスター識別子: todoapp-prod-rds-cluster-<name>-01
– マスターユーザー名: admin
– 認証情報管理: セルフマネージド
※本番環境ではSecretManagerによる管理を推奨します
– マスターパスワード: Passw0rd
接続
– コンピューティングリソース: EC2コンピューティングリソースに接続しない
– VPC: 自身のものを選択
– DB サブネットグループ: todoapp-prod-rds-sgp-<name>-01
– VPC セキュリティグループ: 既存の選択
・todoapp-prod-sg-rds-nakayama-01
下の方の追加設定を開く
– 最初のデータベース名:sampledb

これでRDSを作成できました。
4.EC2でPHP・DB実行環境のセットアップ
まずは、EC2にログインしてください。
ログインしたら以下の工程を進めていきます。
DBクライアントツールのインストール
RDSに接続して操作するために、EC2にMySQLクライアント(MariaDBパッケージ)をインストールします。
sudo dnf update -y
sudo dnf install -y mariadb105
mysql --version
PHPインストール/HTTPサーバーの起動
以下のコマンドでPHPとHTTPサーバーのセッティングを行います。
1. PHPをインストール。
2. PHPとDBの連携
3. HTTPサーバーの再起動
sudo dnf install php
sudo dnf install php-mysqlnd
sudo systemctl restart httpd
php -vもし、httpdがインストールされていない方は以下のコマンドでhttpdのインストールを行ってください。
sudo dnf install -y httpd
sudo systemctl enable --now httpd
PHPファイル作成
以下のコマンドでPHPファイルをEC2で作成します。
sudo touch /var/www/html/index.php作成し終えたら、viコマンドでindex.phpのコードを貼りつけます。
その際、index.phpの3行目を画像で囲まれている自身のRDSクラスターのエンドポイントに書き換え保存します。
エンドポイントの例. todoapp-prod~~~~~~~~~amazon.com
sudo vi /var/www/html/index.php<?php
// ---- 1. RDSの接続情報設定 ----
$host = '自身のRDSクラスターのエンドポイント';
$db = 'sampledb';
$user = 'admin';
$pass = 'Passw0rd';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
// ---- 2. データベース接続 ----
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// ---- 3. データの追加(POSTリクエスト時) ----
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['title'])) {
$stmt = $pdo->prepare('INSERT INTO todos (title) VALUES (?)');
$stmt->execute([$_POST['title']]);
// 再読み込み時の重複投稿を防ぐためリダイレクト
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
}
// ---- 4. データの取得 ----
$stmt = $pdo->query('SELECT * FROM todos ORDER BY created_at DESC');
$todos = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>簡易ToDoアプリ (EC2 × RDS)</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 50px;
background-color: #f9f9f9;
}
.container {
max-width: 500px;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
input[type="text"] {
width: 70%;
padding: 10px;
}
input[type="submit"] {
padding: 10px 20px;
}
ul {
list-style-type: none;
padding: 0;
}
li {
padding: 10px;
border-bottom: 1px solid #eee;
}
</style>
</head>
<body>
<div class="container">
<h2>📝 簡易ToDoリスト</h2>
<form action="" method="POST">
<input type="text" name="title" placeholder="新しいタスクを入力" required>
<input type="submit" value="追加">
</form>
<ul>
<?php foreach ($todos as $todo): ?>
<li><?php echo htmlspecialchars($todo['title'], ENT_QUOTES, 'UTF-8'); ?></li>
<?php endforeach; ?>
</ul>
</div>
</body>
</html>
RDSに接続
次に、下記のコマンドでRDSに接続します。
下記のコマンドは作成したクラスターから確認できます。
下記のコマンドを実行するとパスワードを求められるので先ほど設定したものを打ってください。
– パスワード: Passw0rd
mysql -h <RDSのエンドポイント> -u <マスターユーザー名> -p
データベース・テーブル作成
最後に、データベースとテーブルを作成します。
以下のSQLを実行してください。
CREATE DATABASE IF NOT EXISTS sampledb;
USE sampledb;
CREATE TABLE IF NOT EXISTS todos (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- テスト用の初期データ
INSERT INTO todos (title) VALUES ('EC2とRDSを接続する'), ('PHPのコードを書く');これにてセットアップは終了です。
EC2のパブリックIPアドレスにアクセスし、確認してみましょう。
※URLのプロトコル部分をhttpsではなくhttpにしてください。
5.実際にアプリを操作
以下のようなWebアプリが作成できていれば成功です!
何か、タスクを追加してみましょう。

もし、RDS上のデータベースが変更されているか気になる方はEC2上でSELECT文を実行してみてください!
終わりに
以上でEC2 + RDSでTodoアプリ作成は終了になります。
上手くいっていると嬉しいです!
最後に、本日作成したリソースは全て削除するのを忘れずにお願いします。
それでは、読んでいただきありがとうございました。
同じカテゴリーの記事
同じカテゴリの記事を読む