はじめに
EC2上で動かしているWordPress(charakatsu.com)のデータベースを、EC2内のMariaDBからAmazon RDS(MySQL 8.0)に移行しました。
「本番構成ってどういうもの?」を体で覚えるための第一歩です。
なぜRDSに移行するの?
今までの構成はこうでした。
EC2の中
├── Apache(Webサーバー)
├── PHP
└── MariaDB(データベース)← 全部ここに入ってた
これまでの構成では、WebサーバーとデータベースがEC2の1台にまとまっていました。
そのため、以下のような問題があります。
・EC2障害時の影響範囲が大きい
・バックアップ管理を自分で行う必要がある
・DB負荷が増えるとWeb表示にも影響する
という問題があります。
RDSに移行するとこうなります。
EC2(Webサーバー) → RDS(データベース専用サーバー)
WebサーバーとDBを分離することで、障害の影響範囲を最小化し、それぞれ独立してスケールできる本番環境に近い構成になります。AWSを使ったWebサービスでは標準的なアーキテクチャです。
今までの状態
教室に1人の先生がいて、授業(Web表示)も、成績表の管理(データベース)も、全部その1人がやっている状態です。
先生1人
├── 授業する
└── 成績表も管理する ← 全部この人に頼ってる
この先生が風邪で休んだら?→ 授業も止まるし、成績表も見られなくなります。
RDSに移行した後
授業担当の先生と成績表専門の先生に役割を分けました。
授業担当の先生(EC2) → 成績表専門の先生(RDS)
授業担当の先生が休んでも、成績表専門の先生は無事。逆も然り。役割を分けることで、どちらかが壊れても全滅しない構成になります。
多くのWebサービスでは、Webサーバーとデータベースを分離した構成が採用されています。
MariaDB → MySQL 8.0への移行について
今回はEC2側で使用していたMariaDBから、Amazon RDS MySQL 8.0へ移行しています。
MariaDBとMySQLは高い互換性がありますが、環境によってはSQLや文字コード設定で差異が出る場合があります。今回はWordPress標準構成だったため、特に問題なく移行できました。
実際にやったこと
① 現在のDB情報を確認
bash
cat /var/www/html/wordpress/wp-config.php | grep DB_
WordPressの設定ファイルからDB名・ユーザー名・パスワードを確認しました。
② DBをエクスポート
bash
mysqldump -u wpuser -p'パスワード' wordpress > ~/wordpress_backup.sql
ls -lh ~/wordpress_backup.sql
913KBのバックアップファイルが作成できました。
③ RDSインスタンスを作成
AWSコンソールからはインスタンスタイプが選択できないトラブルがあったので、AWS CLIで作成しました。
bash
aws rds create-db-instance \
--db-instance-identifier charakatsu-db \
--db-instance-class db.t3.micro \
--engine mysql \
--engine-version 8.0 \
--master-username admin \
--master-user-password 'パスワード' \
--allocated-storage 20 \
--no-publicly-accessible \
--region ap-northeast-1
ポイントは --no-publicly-accessible でインターネットからの直接アクセスを遮断していること。EC2経由でしかアクセスできない安全な構成にしています。
起動まで約5〜10分かかります。
bash
# 起動状態を確認
aws rds describe-db-instances \
--db-instance-identifier charakatsu-db \
--query 'DBInstances[0].DBInstanceStatus' \
--region ap-northeast-1
# "available" が出たら完成!
④ エンドポイントを確認
bash
aws rds describe-db-instances \
--db-instance-identifier charakatsu-db \
--query 'DBInstances[0].Endpoint.Address' \
--region ap-northeast-1
charakatsu-db.xxxxxxxx.ap-northeast-1.rds.amazonaws.com というアドレスが発行されます。
⑤ セキュリティグループを設定
EC2からRDSへの接続を許可するルールを追加しました。
- RDSのセキュリティグループのインバウンドルールに
- タイプ:MySQL/Aurora(ポート3306)
- ソース:EC2のセキュリティグループID
を追加します。これでEC2だけがRDSに接続できるようになります。
⑥ RDSにDBとユーザーを作成
sql
CREATE DATABASE wordpress;
CREATE USER 'wpuser'@'%' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'%';
FLUSH PRIVILEGES;
⑦ データをRDSにインポート
bash
mysql -h [RDSエンドポイント] -u wpuser -p'パスワード' wordpress < ~/wordpress_backup.sql
⑧ wp-config.phpのDB_HOSTを変更
bash
sudo sed -i "s/define( 'DB_HOST', 'localhost' );/define( 'DB_HOST', '[RDSエンドポイント]' );/" /var/www/html/wordpress/wp-config.php
変更確認:
bash
cat /var/www/html/wordpress/wp-config.php | grep DB_HOST
# RDSのエンドポイントが表示されればOK
ハマったポイント
AWSコンソールでインスタンスタイプが選べない
無料利用枠テンプレートを選ぶとUIでdb.t3.microが選択できないバグ(?)がありました。AWS CLIで作成することで解決。
SELinuxがDB接続をブロック
ApacheからRDSへの接続がSELinuxにブロックされていました。以下のコマンドで解決:
bash
sudo setsebool -P httpd_can_network_connect=1
sudo setsebool -P httpd_can_network_connect_db=1
補足:CloudFrontのデプロイ待ちに注意
今回はRDS移行とは別にCloudFrontの設定も変更しましたが、設定変更後はデプロイ完了(2〜3分)を待ってからアクセスするのが鉄則です。デプロイ中にアクセスするとアクセスできないことがあります。
完成した構成
ユーザー
↓ HTTPS
CloudFront
↓ HTTPS
EC2(Apache + PHP + WordPress)
↓ MySQL 3306番ポート
RDS(MySQL 8.0 / db.t3.micro)
やったこと まとめ
- DBエクスポート
- RDS作成
- セキュリティグループ設定
- DBインポート
- wp-config.php変更
- 動作確認
まとめ
| 項目 | 移行前 | 移行後 |
|---|---|---|
| DB場所 | EC2内(MariaDB) | RDS(MySQL 8.0 専用サーバー) |
| 障害耐性 | EC2障害の影響範囲が大きい | EC2とDBが独立 |
| スケール | EC2のスペックに依存 | DBだけスケールアップ可能 |
| 管理 | 自分でバックアップ設定 | 自動バックアップ標準装備 |
学習時間は約3時間。トラブル対応が一番勉強になりました。

