2b. AWS環境構築(備忘録)

EC2ではAmazon Linux (ライセンス費用無し)とRHELが選択できるのですが、CentOSはないです。

Amazon Linux はAmazon用にカスタマイズされていてコマンドも違うのではないか、その為に新しいコマンドを無駄に覚えたくない(覚えても仕事には繋がらない)という理由から、RHELを選択して、ボツワナに赴任している間に無料期間の1年が過ぎ、月5千円ほどRHELのライセンス料を支払っていました。

よくよく調べてみると Amazon Linux も CentOS (またはRHEL)と多少の違いがある程度で大きな差異はないようだったので、Amazon Linuxに移行することにしました(無駄に月々5千円多く払っていた。。)。月々約7千円払っていたのが、2千円程度に抑えられそうです。

EC2作成

リージョンは東京を選択します(やっと追加されたみたいですね)。そういえば、2、3年前は英語表示だったのに、今はまともな日本語に変わっていますね(途中は機械翻訳のへんな日本語の時もあったような)。英語勉強中とはいえ、やっぱり日本語の方がありがたい。

EC2(仮想サーバ)を選択します。

2つある内、WordPress用のLAMP環境が構築しやすそうで、Rubyも使えるこちらにしました。インスタンスタイプは「t2.micro」を選択、一般的なブログであればまあ何とか大丈夫です(t2.nanoだとメモリ不足で恐らくWordPressは動作しません)。

システム構成(EC2/t2.micro)

ハードウェア構成
項目 スペック
CPU Intel Xeon 2.40GHz
Memory 1GB
HDD 約9GB
ソフトウェア構成(予定)
項目 内容
OS Amazon Linux AMI 2018.03
MW Apache 2.4.33
MySQL 5.6.40
AP PHP 7.0.30
Git 2.14.4
WordPress 4.9.6

AWSアカウント作成

AWSのEC2は下記のサイトを参考にしました。

Key Pair(秘密鍵)を作成します(画面キャプチャ忘れました)。自分は前回RHELで作成したのと同じのを利用することにしました。
※ Windowsユーザで、AWS初めて触る人の最初の関門ですね(確かWindowsの場合は、下記リンクようにPuTTY Key Generatorを使う必要があった気がします)。

参考
わずか5分!? AWSのEC2でクラウドなウェブサーバーを構築してみた
[EC2] Windows環境で秘密鍵・公開鍵を作成しキーペアにインポートする

EC2にSSH接続

teratermを起動

ホスト名 : ec2-**********.compute.amazonaws.com or IPアドレス
ユーザー名: ec2-user
パスワード: 空白
「RSA/DSA鍵を使う」の「秘密鍵」で先ほど作成した「keyPair.pem」を選択

参考
EC2(Elastic Beanstalk)にSSH接続する

LAMP環境構築

下記のリンクにあるように、Teratermで接続しているとセッションが切れてしまって、都度再接続が必要な場合があります。その場合は、TeratermのKepp-aliveの設定はデフォルトで300秒になっているので、60秒とかにでも変更して設定を保存 (これ忘れがち) しておけばOKです。

参考
Amazon EC2でputtyのセッションが頻繁に切れる場合の対応方法

ロケールやswapの設定をしていきます。

# yum -y update				# インストール済みのパッケージを最新にアップデートする(セキュリティ的に重要)
   :
# date
Tue Jun 19 11:46:41 UTC 2018				# 9時間ズレている
# cp -p /etc/localtime /etc/localtime.org
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime	# ロケール設定を東京に変更
# date
Tue Jun 19 20:48:29 JST 2018				# 時刻のズレが解消
# 
# vi /etc/sysconfig/clock					# 下記のようにタイムゾーン設定を設定
   :
# diff /etc/sysconfig/clock.org /etc/sysconfig/clock
1c1
< ZONE="UTC"
---
> ZONE="Asia/Tokyo"
# 
# mkswap /swap								# /swap に、1G(1Mx1024)の領域を確保
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=429b5961-af0d-4436-b6b8-ca35f96c03f3
# chmod 0600 /swap
# swapon /swap
# free
             total       used       free     shared    buffers     cached
Mem:       1011176     940908      70268        144      48460     326476
-/+ buffers/cache:     565972     445204
Swap:      1048572          0    1048572	# /swap が作成されたことを確認
#
# vi /etc/rc.local							# 起動時にswapがONされるよう設定
   :
swapon /swap
# shutdown -r now							# 一旦リブート
#

参考
Amazon Linux サーバセットアップメモ

続いて、LAMP環境を構築していきます。

# yum install -y httpd24 php70 php70-mysqli php70-mbstring		# Apache、PHP、PHP拡張モジュールのインストール
   :
# yum install -y git											# Gitもインストール
   :
# httpd -v										# Apacheのバージョン確認
Server version: Apache/2.4.33 (Amazon)
Server built:   May 23 2018 19:02:39
# php -v										# PHPのバージョン確認
PHP 7.0.30 (cli) (built: May 10 2018 17:39:13) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
# service mysqld start							# MySQLの起動
   :
# mysql --version								# MySQLのバージョン確認
mysql  Ver 14.14 Distrib 5.6.40, for Linux (x86_64) using  EditLine wrapper
# git --version
git version 2.14.4
# 
# service httpd start							# Apacheの起動
Starting httpd:                                            [  OK  ]
#
# chkconfig httpd on							# httpdを自動起動
# chkconfig mysqld on							# mysqldを自動起動
# chkconfig										# 設定されていることを確認
   :
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
   :
# 

AWS側でセキュリティグループのインバウンドタブをクリックして、SSH/HTTP/HTTPSポートによる通信を許可するルールを追加します(AWSコンソール→EC2→Security Groups→Inbound→Edit)。

ブラウザより、 http://IPアドレス/ にアクセスし、Apacheのページが表示されることを確認します。

apacheユーザへドキュメントルート(/var/www)へのアクセス許可を与えます。
プラグインの更新/ダウンロード、テーマのダウンロード等でftp接続情報を求められますが、apacheユーザへアクセス許可を付与しておけば、その画面が表示されることなくダウンロードが実施されます。ここで、その設定をしておかないと下記のように結構ハマります。ec2-userユーザへファイル所有者を変更するような記事が多いですが、「Wordpressのディレクトリのownerがphp(apache)実行ユーザと同一であること」が条件なので、apacheユーザへ変更するのが正解ですね。

  • ec2-userユーザは公開鍵方式でパスワードを手入力しない
  • じゃあ別にftp用アカウントを作成する必要がある? ⇒ 上手くいかない
  • ftpサーバ(vsftpd)立てる必要あり? ⇒ 上手くいかない
  • wp-config.phpを変更する? ⇒ セキュリティ的に脆弱
  • functions.phpを変更する? ⇒ テーマをアップデートした時に上書き更新されないよう、子テーマを変更する?(なんか面倒くさくなってきた…)
# chown -R apache:apache /var/www					# /var/wwwディレクトリ配下の所有者/グループを変更
# find /var/www -type d -exec chmod 2775 {} \;		# /var/www配下のディレクトリの権限変更
# find /var/www -type f -exec chmod 0664 {} \;		# /var/www配下のファイルの権限変更
#

参考
AWS EC2にLAMP環境を構築するまで
WordPressのアップグレードやプラグインの更新をFTP画面なしで行う方法

phpinfoの設置

$ vi /var/www/html/phpinfo.php
<?php
    echo phpinfo();
?>

ブラウザで http://IPアドレス/phpinfo.php にアクセスし、以下のように表示されることを確認

PHP設定

# /etc/php.ini を下記のように編集
# diff php.ini.org php.ini
877c877
< ;date.timezone =
---
> date.timezone = Asia/Tokyo			# タイムゾーン設定
1465c1465
< ;mbstring.language = Japanese
---
> mbstring.language = Japanese			# 日本語設定
1472c1472
< ;mbstring.internal_encoding =
---
> mbstring.internal_encoding = UTF-8	# 文字コード設定
1480c1480
< ;mbstring.http_input =
---
> mbstring.http_input = auto
1503c1503
< ;mbstring.detect_order = auto
---
> mbstring.detect_order = auto

参考
AWS EC2にLAMP環境を構築するまで

MySQL設定

# mysql -u root -p
Enter password:

mysql> create database wp;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wp.* to admin@localhost identified by 'wp用の任意パスワード';
Query OK, 0 rows affected (0.00 sec)

参考
MySQLの設定 – WordPressのインストール

WordPressのインストール

WordPressのダウンロード

$ wget http://ja.wordpress.org/latest-ja.tar.gz				# WordPressのダウンロード
$ sudo tar zxvf latest-ja.tar.gz -C /var/www/				# WordPressの展開
$ sudo su -
# chown -R apache:apache /var/www/wordpress					# ファイル所有者/グループを変更
# find /var/www/wordpress -type d -exec chmod 2775 {} \;	# /var/www/wordpress配下のディレクトリの権限変更
# find /var/www/wordpress -type f -exec chmod 0664 {} \;	# /var/www/wordpress配下のファイルの権限変更
#
# vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/wordpress"						# DocumentRootをWordPressのディレクトリに変更
<Directory "/var/www/wordpress">						# DocumentRootと同じディレクトリに変更
     AllowOverride All									# .htaccessによるディレクティブの上書きを許可
# service httpd restart									# Apacheの設定を反映
Stopping httpd:							[  OK  ]
Starting httpd:							[  OK  ]

WordPressのインストール

ブラウザで http://IPアドレス/ にアクセスし、インストール実施

参考
WordPressのインストール(CentOS)

固定IPアドレスの設定&ドメインの割り当て

固定IPアドレスの設定
デフォルトの状態では、AWS EC2のIPアドレスは再起動のタイミングで変わります。その状態では色々不具合が出てくるので、下記リンクを参考にIPアドレスを固定します。その後、ドメインを紐づけます。

参考
Elastic IP アドレスの設定とRoute 53から独自ドメインの割当

WordPressトラブルシューティング

WordPressを設置しているサーバのドメイン/固定IPを上記で変更したことで、管理画面が開けなくなります。WordPressをセットアップした際に、WordPressで使用しているDBにドメイン/IPアドレスの情報が記録されているので、このDBのレコードを更新する必要があります(WordPressインストール前にIPアドレスを固定していれば、この作業は不要になるので楽です)

$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ php wp-cli.phar --info
OS:     Linux 4.14.47-56.37.amzn1.x86_64 #1 SMP Wed Jun 6 18:49:01 UTC 2018 x86_64
Shell:  /bin/bash
PHP binary:     /usr/bin/php-7.0
PHP version:    7.0.30
php.ini used:   /etc/php.ini
WP-CLI root dir:        phar://wp-cli.phar
WP-CLI vendor dir:      phar://wp-cli.phar/vendor
WP_CLI phar path:       /home/ec2-user
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 1.5.1
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
$ wp option update siteurl '新URL' --path=/var/www/wordpress
Success: Updated 'siteurl' option.
$ wp option update home '新URL' --path=/var/www/wordpress
Success: Updated 'home' option.
$ wp search-replace '旧URL' '新URL' --path=/var/www/wordpress --skip-columns=guid
+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
   :
| wp_options       | option_value          | 1            | PHP  |
| wp_posts         | post_content          | 2            | SQL  |
   :
Success: Made 3 replacements.

参考
アドレス変更したらWordPressが壊れた

ドメイン名取得

下記リンクを参考に、AWSのRoute 53でドメインを購入します。.comドメインは、$12/年で、他のドメイン提供企業と大差はないようです。

参考
Amazon Route 53でドメインを購入する

固定グローバルIPアドレスにドメイン名を関連付ける
下記リンクを参考に、固定グローバルIPアドレスにドメイン名を関連付けます。

参考
Route 53から独自ドメインの割当

WordPressデータインポート/エクスポート

プラグインAll-in-One WP Migrationを使用することで、プラグインも含めてエクスポート/インポートできます。無料版は512MBが上限のようなので、バックアップファイルは削除するか、別なディレクトリへ移動してから実施します。「PHPのバージョン差異で問題発生するかもね」といった警告メッセージが表示されて、結果インポートできなかったので、仕方なくWordPress標準のエクスポート/インポートツールを使用して、その後はプラグインを逐次インストールしました。

参考
WordPressのサイトを別のサーバーに移行する方法
6b. WordPress制作入門(備忘録)

WordPressの画像とDBエクスポート/インポート

メディア画像は下記ディレクトリに保管されているので、WinSCPなどを使ってローカルPCにダウンロード後、AWSのEC2サーバへアップロードします。

/var/www/wordpress/wp-content/uploads配下の2018、2017、…、(年月形式でメディア画像を格納していた場合)

DBを作成していた場合は、下記を参考にDBをエクスポート/インポートします。

MySQLのデータベースをまるっとお引越し。 (エクスポート/インポート)

内部リンクを相対パスで設定していれば問題ないのですが、絶対パスで設定していた場合、下記のように変更が必要です。新①でもOKですが、ここで絶対パスを使用すると、今後移行する時にまた問題となるので、新②のような相対パスで設定しておきます。
旧:http://jocv-mb.com/setswana
新①:http://blessed-rain.com/setswana
新②:../setswana

WordPressのデータベースを直接書き換えて画像のリンク切れを解消した話

アイキャッチ画像も再度設定が必要になります。Export Featured Imagesプラグインを使用することで、アイキャッチ画像をインポートできるようです。私の旧WordPressはお亡くなりになっていたので、手動で一つ一つ再設定する羽目になりました。。

WORDPRESS でアイキャッチ画像をインポートする方法

ファビコン(favicon)設定

ブラウザ上のタブや、お気に入り一覧で表示されるそのサイトのアイコンをファビコン(favicon)といいます。下記を参考に設定します。

参考
WordPressでファビコンを表示させる方法

301リダイレクト設定

旧URLにアクセスした際、新URLにリダイレクトするように、301リダイレクト設定をしておきます。1月程度並行稼働しておき、その後古いAWSサーバは解約します。

参考
サイトリニューアル時の301リダイレクト

やってしまったこと/ハマったこと

個人ブログなので(仕事ではないし)、開発環境での検証もせずに、取り敢えずやってみたら色々ハマって、トラブルシューティングのいい勉強になりました。

①新サーバのPHPのバージョンは7.0なので、旧サーバ(PHPのバージョンは5.6)のWordPressのプラグインを引っ張ってこれなかったので、よく考えずに旧サーバのPHPのバージョンを上げるといいことあるかなとなぜかその時は思ってしまってバージョンを上げる ⇒ WordPressが動かなくなる ⇒ ダウングレードしても動かずご臨終…

②WordPressで使用するDBとは別のDBを作成していたので、その作成が終わって、WordPress用のDBを何用か忘れてしまって、うっかりDBを削除 ⇒ WordPressが動かなくなる ⇒ DBのバックアップを毎日取得する設定にしていたので、そのデータから前日の状態までは復旧