MENU
オンライン講座開催中

EC2のWordPressをRDSへ移行する方法【Amazon Linux 2023・MySQL 8.0】

EC2のWordPressをRDSへ移行する方法【Amazon Linux 2023・MySQL 8.0】
目次

はじめに

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)

やったこと まとめ

  1. DBエクスポート
  2. RDS作成
  3. セキュリティグループ設定
  4. DBインポート
  5. wp-config.php変更
  6. 動作確認

まとめ

項目移行前移行後
DB場所EC2内(MariaDB)RDS(MySQL 8.0 専用サーバー)
障害耐性EC2障害の影響範囲が大きいEC2とDBが独立
スケールEC2のスペックに依存DBだけスケールアップ可能
管理自分でバックアップ設定自動バックアップ標準装備

学習時間は約3時間。トラブル対応が一番勉強になりました。

  • URLをコピーしました!
目次