AWS

EC2 + RDSでTodoアプリ作成

NEW 2026年8月18日

目次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 サブネットグループを作成していきます。
まずは、Aurora and RDS>サブネットグループ>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パッケージ)をインストールします。

DB_client.txt
sudo dnf update -y
sudo dnf install -y mariadb105
mysql --version

 

PHPインストール/HTTPサーバーの起動
以下のコマンドでPHPとHTTPサーバーのセッティングを行います。

1. PHPをインストール。

2. PHPとDBの連携

3. HTTPサーバーの再起動

PHP_install.txt
sudo dnf install php
sudo dnf install php-mysqlnd
sudo systemctl restart httpd
php -v

もし、httpdがインストールされていない方は以下のコマンドでhttpdのインストールを行ってください。

httpd_install.txt
sudo dnf install -y httpd
sudo systemctl enable --now httpd

 

PHPファイル作成
以下のコマンドでPHPファイルをEC2で作成します。

touch.txt
sudo touch /var/www/html/index.php

作成し終えたら、viコマンドでindex.phpのコードを貼りつけます。
その際、index.phpの3行目を画像で囲まれている自身のRDSクラスターのエンドポイントに書き換え保存します。
エンドポイントの例. todoapp-prod~~~~~~~~~amazon.com

touch.txt
sudo vi /var/www/html/index.php
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

RDS_connect.txt
mysql -h <RDSのエンドポイント> -u <マスターユーザー名> -p

 

データベース・テーブル作成
最後に、データベースとテーブルを作成します。
以下のSQLを実行してください。

mk_db.txt
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アプリ作成は終了になります。
上手くいっていると嬉しいです!

最後に、本日作成したリソースは全て削除するのを忘れずにお願いします。

それでは、読んでいただきありがとうございました。

この記事を書いた人

仲山芳古

yoshifuru_nakayama

北海道から来ました。
Android開発が好きです。