既存のVPSのWordPressをEC2+AuroraServelessに移行してみた

今現在、趣味でConohaにて運用しているWordPressのサイトがあるのですが、VPSを別の用途で使いたいと思いまして、サイトの移行を考えています。
そして移行第一弾としてこのWordPressサイトをそのままAWSに移してみようということで今回、移行作業にトライしてみました。
これを機会にDNSもConohaに設定していたのをRoute53に移しています。
ちなみにRoute53への移行はここのサイトを参考にしました。後はVPCの設定とかは
事前に全部完了させている想定です。

大まかな手順は以下の通りです。色々と先人がいたおかげで、結構簡単にできました。
1.既存サーバでデータベースのエクスポートと既存サイトの圧縮
2.EC2にてWebサーバを構築(nginx+PHP7.3)
3.AuroraServelessにてデータベース設定
4.既存サーバから取得したデータベースと既存サイトを展開
5.nginx起動

ではコマンド類です。
参考
https://qiita.com/morizyun/items/f45dc580bac0ebba79ab 

1.既存サイト側の作業 
(1)MySQLバックアップ
$ sudo mysqldump --default-character-set=utf8 -u root -p samplesite > ~/20191001_wpdump.sql
$ cd
$ sudo chown sshloginuser 20191001_wpdump.sql
$ sudo mv 20191001_wpdump.sql /home/sshloginuser
(2)WordPressバックアップ
$ cd /var/www/
$ sudo tar -czvf samplesite_bkup.tar.gz samplesite
$ sudo chown sshloginuser samplesite_bkup.tar.gz
$ sudo mv samplesite_bkup.tar.gz /home/sshloginuser
$ sudo vi samplesite/wp-config.php

※以下の箇所を控えておく(移行時に使用する)
----------------------------------------
/** WordPress のためのデータベース名 */
define('DB_NAME', 'samplesite');
/** MySQL データベースのユーザー名 */
define('DB_USER', 'dbuser');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password');
----------------------------------------

2.AWSサーバ構築
(1)ElasticIPの割当  
停止している状態でインスタンスにElasticIPを割当する。

(2)初期設定
## ホスト名設定
$ sudo hostnamectl set-hostname basesrv
## アップデート
$ sudo apt-get -y update
$ sudo apt-get -y upgrade
## 日本語化
$ sudo apt-get -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo apt-get -y install binutils
$ strings /etc/default/locale
$ sudo apt-get -y install manpages-ja manpages-ja-dev
## timeZone設定
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
$ strings /etc/localtime
$ date
## chkrootkitインストール
$ sudo apt-get -y install chkrootkit
$ sudo  chkrootkit | grep INFECTED
## デフォルトエディタ変更
$ sudo update-alternatives --config editor
$ sudo apt-get -y remove nano
## 追加リポジトリ
$ sudo apt-get -y install apt-file
## logwatchインストール
$ sudo apt-get -y install logwatch
# ubuntuユーザをwww-dataグループに追加
$ sudo usermod -aG www-data ubuntu

(3)バックアップしたファイルをEC2にアップロードする。
・対象ファイル:
20191001_wpdump.sql
samplesite_bkup.tar.gz

(4)Webサーバ類インストール
## nginxインストール
$ sudo apt-get -y install nginx
$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
## PHP7.3インストール
$ sudo add-apt-repository ppa:ondrej/php
~略~
# LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
 詳しい情報: https://launchpad.net/~ondrej/+archive/ubuntu/php
[ENTER] を押すと続行します。Ctrl-c で追加をキャンセルできます。  ←Enterキー押下
$ sudo apt-get update
$ sudo apt-get -y install php7.3-fpm php7.3-common php7.3-mbstring php7.3-xmlrpc php7.3-soap php7.3-gd php7.3-xml php7.3-intl php7.3-mysql php7.3-cli php7.3-zip php7.3-curl
$ php -v
PHP 7.3.9-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Sep  2 2019 12:54:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.9-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
## PHP.ini編集
$ sudo vi /etc/php/7.3/fpm/php.ini
memory_limitを書き替え
++++++++++++++++++++++++++++++++++
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 256M
++++++++++++++++++++++++++++++++++

(5)データベースクライアントインストール
## MariaDBインストール
$ sudo apt-get -y install mariadb-server
$ mysql --version
mysql  Ver 15.1 Distrib 10.1.41-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

(6)Webサーバ関連設定
## Basic認証設定
$ sudo apt -y install apache2-utils
$ sudo htpasswd -c /etc/nginx/.htpasswd samplesite
New password: password
Re-type new password: password
## SSL証明書設定
$ sudo apt -y install letsencrypt
$ sudo systemctl stop nginx
$ sudo letsencrypt certonly --standalone -d cms.samplesite.com
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): mail@sample.com
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
$ sudo crontab -e
# 毎週月曜の朝5時にSSL証明書を自動更新する(nginxが停止/起動されるので注意)
00 05 * * 1 sudo systemctl stop nginx; sudo letsencrypt renew; sudo systemctl start nginx

## 設定ファイル修正
$ sudo vi /etc/nginx/nginx.conf
※以下の通り修正
------------------------------
http {
        ##
        # Basic Settings
        ##
++        server_tokens off;
   keepalive_timeout 160;  ←修正
          server_tokens off;      ←修正
------------------------------


$ sudo vi /etc/nginx/conf.d/samplesite.conf
※以下の通り新規作成
------------------------------
upstream phpfpm{
  server unix:/var/run/php/php7.3-fpm.sock;
}

server {
        listen 80; # httpへのアクセスをhttpsへリダイレクトする
        listen [::]:80;
        server_name  YOURIPADDR;
        server_name  cms.samplesite.com;

        if ($http_x_forwarded_proto != https) {
            return 301 https://$host$request_uri;
        }
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl on;
    server_name  YOURIPADDR;
    server_name  cms.samplesite.com;
    index  index.html index.htm index.php;
    client_max_body_size 128M;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_session_timeout 5m;

    ssl_certificate /etc/letsencrypt/live/cms.samplesite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cms.samplesite.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains" always;

    location / {
        root /var/www/samplesite;
        index index.html index.htm index.php;

        auth_basic "Please Input ID and Password";
        auth_basic_user_file /etc/nginx/.htpasswd;

        try_files $uri $uri/ /index.php?$query_string;

        if ( !-e $request_filename ) {
            rewrite ^ index.php last;
        }
    }
 
    location ~ \.php$ {
        fastcgi_pass phpfpm;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/samplesite/$fastcgi_script_name;
        include fastcgi_params;
    }
}
------------------------------

3.AurolaServeless設定
参考
https://dev.classmethod.jp/cloud/aws/aurora-serverless-mysql-generally-available/
 注意点:
・MySQL との互換性を持つ Amazon Auroraを選択する。
・現状はVersionは5.6.10aでないとダメ
・[リージョン別]にして[データベースの機能]で[サーバレス]を選択
・[スケーリングの追加設定]でアイドルタイムを忘れず設定する
・DB クラスター識別子情報:samplesite
・認証情報の設定
 マスターユーザー名情報 root
 マスターパスワード情報 password

4.移行作業 
まずはAuroraのエンドポイントを確認しておく。

(1)データベース復元
## MySQLのリストア用データベース作成
$ mysql -h Auroraのエンドポイント -P 3306 -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
~中略~
MySQL [(none)]>create database samplesite character set utf8;
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| samplesite          |
+--------------------+
4 rows in set (0.00 sec)

## ユーザ作成
MySQL [(none)]> create user dbuser;
Query OK, 0 rows affected (0.01 sec)
MySQL [(none)]> grant all privileges on samplesite.* to 'dbuser'@'%' identified by 'password' with grant option;
Query OK, 0 rows affected (0.07 sec)

MySQL [(none)]> select user,host,password from mysql.user;
+-----------+-----------+-------------------------------------------+
| user      | host      | password                                  |
+-----------+-----------+-------------------------------------------+
| rdsproxy  | %         | *E863E25EED0B290C753CCCF27CA6E4AE4BD84217 |
| root      | %         | *0E27CE76AEADA70A520E49FF927F40699324DA1B |
| dbuser | %         | *0E27CE76AEADA70A520E49FF927F40699324DA1B |
| rdsadmin  | localhost | *5EE80EE2468053AF0C207E5139ADD3032CB238E1 |
+-----------+-----------+-------------------------------------------+
4 rows in set (0.01 sec)
MySQL [(none)]> SHOW GRANTS FOR 'dbuser';
+--------------------------------------------------------------------------+
| Grants for dbuser@%                                                   |
+--------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dbuser'@'%' IDENTIFIED BY PASSWORD REQUIRE SSL |
| GRANT ALL PRIVILEGES ON `samplesite`.* TO 'dbuser'@'%'                 |
+--------------------------------------------------------------------------+
2 rows in set (0.00 sec)
MySQL [(none)]> Bye

##ログイン確認
$ mysql -h Auroraのエンドポイント -P 3306 -u dbuser -p samplesite
Enter password:
~中略~
MySQL [samplesite]> Bye

##データリストア
$ sudo mysql -u root -h samplesite.cluster-crklykpqiipf.ap-northeast-1.rds.amazonaws.com -p samplesite < ~/20191001_wpdump.sql
$ mysql -h Auroraのエンドポイント -P 3306 -u dbuser -p samplesite
MySQL [samplesite]> show tables;
+-----------------------+
| Tables_in_samplesite   |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_social_users       |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
13 rows in set (0.01 sec)
MySQL [samplesite]> Bye

(2)WordPressリストア
$ cd
$ sudo tar -xvzf samplesite_bkup.tar.gz
$ sudo cd samplesite.com
$ sudo mv wp samplesite
$ sudo chown -R ubuntu samplesite
$ sudo chgrp -R ubuntu samplesite
$ sudo mv samplesite /var/www/
$ cd /var/www/samplesite

$ sudo vi wp-config.php
※以下の箇所を修正する
----------------------
/** MySQL のホスト名 */
define('DB_HOST', 'Auroraのエンドポイント');
----------------------
$ cd ../
$ sudo chgrp -R www-data samplesite/
$ sudo chown -R www-data samplesite/

(3)ドメイン書替 ツールをアップロードしてデータベース内のドメインを書替する。
参考
https://webcre-archive.com/2012/10/04/wordpress-db-url-replace/ https://sumirexxx.com/2018/01/24/search-replace-db2-new/
$ sudo chgrp -R www-data Search-Replace-DB-master/
$ sudo chown -R www-data Search-Replace-DB-master/
$ sudo mv Search-Replace-DB-master /var/www/samplesite/
$ cd /var/www/samplesite/

・以下にアクセスしてDryRunで確認後に実行
https://cms.samplesite.com/Search-Replace-DB-master/
↑自分のサイトに置きかえてやってください。

 実行後に忘れずに削除
$ sudo rm -Rf Search-Replace-DB-master/

(4)nginx起動
$ sudo service nginx restart

これでEC2+AuroraServelessの構成でWordPressできました。
AuroraServelessはアイドルの時はストレージの課金のみなので、使用ケースによっては
RDSとかAuroraに比べればかなりコスト安で安心感を手に入れることができます。

ちなみにこちらでは、Basic認証かけてほとんどアクセスない状態でしたが、
半日で$0.68も課金されました。まぁこの辺は1日だけしか見てないし何とも言えないのでしばらく様子見が必要ですが、、

ちなみにAuroraServelessはPostgreSQLにも対応しています。
なのでバックエンドでMySQLとかPostgreSQLを使っている営業時間限定で
稼働すればいい記帳系の基幹システムとかだともしかしたらコスト削減できるかも
しれないです。まぁ無理なんだろうけどOracleとかSQLServerでAuroraServeless
みたいなことできれば世の記帳系基幹システムの運用コストは軽く落とせるんで
しょうけどねぇ。

ちなみにアイドルになると戻るまでに20秒程度の時間がかかります。なので
アクセス数多いサイトのバックエンドDBとか、24時間常時使うシステムのバックエンドDBとかには向いていません。記帳系の基幹システムの場合はサーバが起動するタイミングでDBサーバに接続するコマンドなんかで叩き起こすスクリプトを起動時にキックさせれば
アイドルからの戻り時間問題はクリアできるのではないかと、、、、

そして移行先のAWSでは極力コストをかけない様に持っていきたいので、最終的にはCloudFront+S3の静的サイトパターンに持っていきたいのです。
※サーバ立ててやる分にはConohaの方が確実に月額は安いです。なのでS3にしたい。

静的サイトパターンのうまい方法は試行錯誤中です。更新に時間がかかる問題があるのでStaticPressS3とかShiftterはあまり使いたくないけど、初期移行にはこれ使わないといけないのかなぁとか、サイト更新の運用とかどうしようと思っていたりします。ヒントあれば教えていただけると幸いです。
早くVPSを開けないとバッチ系のプログラムの実験とかが厳しいので、早く片付けてしまいたいと思っています。

ちまちまやってるから移行作業2019年中に完了できるんだろうか。

コメント

このブログの人気の投稿

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

証券外務員1種勉強(計算式暗記用メモ)

マクロ経済学(IS-LM分析)