14
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WordpressをAWS(Elastic Beanstalk+RDS+S3+CloudFront)に移行

Posted at

WordpressをさくらVPS1台からAWSにサーバ移行を行ったので、それに関する流れをメモしてみました
ところどころ詰まったので、2日くらいかけて作業していたと思います

使用したAWS環境

  • Elastic Beanstalk
  • RDS
  • S3
  • CloudFront

Elastic Beanstalk立ち上げ

ここは他に分かりやすい記事がたくさんあるので、そちらを確認した方が良いかと思われます

アプリケーション登録

サーバから画像ファイル(wp-content/uploads)を抜いたファイルを全てダウンロード

rsync -ahv --exclude='uploads/*' hoge@***.***.***.***:/var/www/html/アプリケーション名 ~/Documents

このファイルを指定して、Elastic Beanstalkを立ち上げます
(ユーザ情報や、固定ページなどそういった情報は保持されません。データベースの移行を行うと移行されます)

Wordpressセットアップ

RDSを立ち上げる時に指定したユーザ名・パスワードを指定します
データベース名はデフォルトのebdbです

データベースの移行

MySQLのデータベースをRDSに移行します

RDSのセキュリティグループの変更

EC2インスタンス→セキュリティグループ→対象のRDSを選択
インバウンドで許可するIPアドレスを登録できます
今回はデータを移行するので、移行元のサーバのIPアドレスを登録しました

  • タイプ: MYSQL/Aurora
  • プロトコル: TCP
  • ポート範囲: 3306
  • 送信元: サーバのIPアドレス(160...*/32)

IPアドレスですが/32を指定してユニキャストにする必要があります

RDS設定の変更

RDSのインスタンス→インスタンスの操作→変更から
ネットワーク&セキュリティのパブリックアクセス可能を「はい」にします
また、メンテナンスのすぐに適用にチェックを入れることで即変更できます

インスタンスのステータスが変更中から利用可能に変わったらアクセス可能です
以下のコマンドでアクセスできます

mysql -h ***.ap-northeast-1.rds.amazonaws.com -u ユーザ名 -p -P 3306

移行

データベースをdumpしてから実行

mysqldump -u root -p データベース名 > dump.sql

mysql -h ***.ap-northeast-1.rds.amazonaws.com -u ユーザ名 -p -P 3306 ebdb < dump.sql

画像データの移行

画像データをS3に移行します
色々な方法があるかと思いますが、今回はAWS CLIを用いて同期する方法を選びました

AWS CLIインストール

AWS CLI のインストールと設定を参考にインストールします
CentOSなので、次のような手順を踏みます

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py

sudo pip install awscli

これでコマンドライン上でS3の設定・アップロードなどができるようになります

AWS CLI設定

aws configureで設定をします
これを行う前に、S3を扱う事ができるIAMユーザを準備しておくと便利です

aws configure
AWS Access Key ID [None]: アクセスキー
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json

アップロード

以下のコマンドでアップロードします
配信の準備のため移行先は/wp-content/uploads/とします

aws s3 sync uploads/ s3://バケット名/wp-content/uploads/

CloudFrontで画像配信

リクエストされたURLがhttp://***/wp-content/uploads/*の場合はS3に見に行ってもらうように設定します
こうする事でデータベースの画像リンクなどを書き換える必要がなくなります

設定

AWS CloudFrontを使ってWordPressのメディアファイルだけS3に配置する
こちらを参考にしました

CloudFrontの設定(通常ファイル)

Create Distributionsを選択

Webを選択して、項目を記入していきます
さきほど参考にあげたサイトさんが詳しく説明されているので、そちらを参考にされると良いと思います

ちなみに、まだ本番のドメインを使わずにテストだけ…という場合はAlternate Domain Names (CNAMEs)はまだ記入しなくても問題ないです(記入しておいても問題ないです)

最初のこの登録は、
リクエストがあったときにElastic Beanstalkで立ち上げたロードバランサに誘導する
といった目的のものとなります

Deployedまで待つ

CreateしてもDeployedになるまで15分かもうちょっとかかります
結構かかるので気長に待ちます

CloudFrontの設定(画像ファイル)

DeployedされたらそのDistributionを選択します

ずらっと並ぶタブから2つ設定します

  • Origins
  • Behaviors

OriginでS3を登録して、Behaviorでパスが/wp-content/uploads/*だったらS3に飛ばす旨を登録します
これも先程の参考サイトさんを見ていただくと分かりやすいかと思います

この登録で
画像のリクエストがあったときに、CloudFrontに誘導する
ことができました

Wordpressプラグイン

これらを登録し、Access Keysにアクセスキーやシークレットキーを登録します
S3 and CloudFrontでは次のように設定します

テスト中はカスタムドメインのところにCloudFrontのドメインを登録すると良いかと思われます
本番のドメインを使用する際になったらそちらに変更してください

表示の確認

以上でCloudFrontの設定は完了です
CloudFrontのDistributionに表示されているDomain Nameにアクセスするとサイトが表示され、S3にある画像にもアクセスできるようになります

504 Timeout エラー

CloudFront経由で記事のページがいくらたっても表示されませんでした
また、カテゴリのページも時間がかかりました
以上の状況から、get_categoriesのある部分を消す事によって、記事のページが表示されるようになりました

CloudFrontではタイムアウトが30秒(10秒?)に設定されているらしく、処理に時間がかかりすぎると接続が切れてしまいます
Wordpressの処理速度をテストしていく必要がありそうです

まとめ

実際何度か作業に詰まりましたが、見返してみると非常に簡単な作業であることが分かりました
インフラエンジニアではないので分からない事も多かったのですが、都度調べる事で追いつける程度ではあります

14
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?