【AWS】Amazon AuroraでもWordPressは動くの？

##この記事の目的

- MySQLやPostgreSQLと互換性のあるAmazon AuroraでもWordPressが動作するか検証するため。

- 執筆者自身がAWS初心者のため、自身の勉強も兼ねて。

##先行者
[WordPressをAmazon Auroraで動かしてみる](https://dev.classmethod.jp/articles/wp-aurora/)

2015年の記事であり、AuroraがまだTokyoリージョンで使えなかった時の記事であるため、本記事執筆の意義は十分にあると思います。

##WordPressの推奨環境
>PHP バージョン 7.4 以上。
>MySQL バージョン 5.6 以上、または MariaDB バージョン 10.1 以上。
>HTTPS 対応

https://ja.wordpress.org/about/requirements/

##忙しい人のために
「こんな長い記事を読んでられないよ」という人のために結論から言います。
結論はAmazon AuroraでもWordPressは動きます。以上。

##構成図
本記事で構成するシステムはこんな感じです。
![aws_scheme..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/11271ae0-207b-8149-64a7-c50458414214.png)

##Amazon Auroraを使ってWordPressを立ち上げてみよう
やってみよう。

###VPCの作成
####VPC
VPCのコンソールから右上の`VPCの作成`をクリックします。
![AWS_VPC1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/e9be1a25-fbcf-cd63-ccf8-7609fcd1ea36.png)
名前タグを「My_VPC_1」、IPv4 CIDRブロックを「10.0.0.0/21」に設定します。
右下の`VPCを作成`をクリックするとVPCが作成されます。
![AWS_VPC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/ca6379fa-7040-bf9c-70a2-1c6bbfa878a1.png)
####サブネット
次にパブリックサブネットを作成します。
サブネットの項目に移り、右上の`サブネットを作成`をクリックします。
![AWS_VPC3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/c237eb06-4da8-04d3-7ecf-c86b2c2d0c68.png)
VPC IDを先ほど作成した「My_VPC_1」に、サブネット名を「PublicSubnet1」、アベイラビリティゾーンを「アジアパシフィック(東京)/ap-northeast-1a」、IPv4 CIDRブロックを「10.0.0.0/24」に設定します。
右下の`サブネットを作成`をクリックするとパブリックサブネットが作成されます。
![AWS_VPC4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/0ccc3e02-6658-09c7-69b3-12237a6f4ff5.png)
同様の手順でサブネット合計4つ作成します。
ちなみに`新しいサブネットを追加`で同じVPC内に複数のサブネットを同時に作成することができます。

|VPC ID|サブネット名|アベイラビリティゾーン|IPv4 CIDRブロック|
|---|---|---|---|
|My_VPC_1|PublicSubnet1|アジアパシフィック(東京)/ap-northeast-1a|10.0.0.0/24|
|My_VPC_1|PublicSubnet2|アジアパシフィック(東京)/ap-northeast-1c|10.0.1.0/24|
|My_VPC_1|PrivateSubnet1|アジアパシフィック(東京)/ap-northeast-1a|10.0.2.0/24|
|My_VPC_1|PrivateSubnet2|アジアパシフィック(東京)/ap-northeast-1c|10.0.3.0/24|

`注
RDSを起動するために、複数のアベイラビリティゾーンにまたがってサブネットを作っておかなければならないので、このようにサブネットを作成しています。　`

###EC2の作成
####インスタンス
次にEC2インスタンスを作成していきます。
EC2のコンソールのインスタンスの項目に移ります。
右上の`インスタンスを起動`をクリックします。
![AWS_EC2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/c97dfedc-c419-a59b-aa39-377ec15825fa.png)
AMIはAmazon Linux2を選択します。
![AWS_EC2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/db67e085-ba21-8bf3-f4f0-34d84308cb4c.png)
インスタンスタイプはt2.microを選択して、`次のステップ`をクリックします。
![AWS_EC2_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/bb4f8fef-6706-50b6-ef6b-d23e88469e29.png)
ネットワークは「My_VPC_1」、サブネットは「PublicSubnet1」、自動割り当てパブリックIPは「有効」に設定し、`次のステップ`をクリックします。
![AWS_EC2_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/f56f9e43-8ab8-cdaf-5568-8f21dda8f747.png)
ストレージはデフォルトのまま`次のステップ`に移ります。
![AWS_EC2_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/8f38a854-1645-0c59-7e42-dc77a6a00a32.png)
タグの設定は、キーを「Name」、値を「TestServer1」にします。`次のステップ`に移ります。
![AWS_EC2_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/38be1e60-e285-266e-33de-33a5d60eaa92.png)
新しいセキュリティグループを作成します。セキュリティグループ名は「Web-SG-1」、説明も同じです。
SSHのみだとWebサーバが公開できないので、HTTPを追加します。
`確認と作成`をクリックします。
![AWS_EC2_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/0263a6d7-324c-9f8d-9125-157ae76dc525.png)
確認画面です。問題がなければ`起動`をクリックします。
![AWS_EC2_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/08b3fc6a-85e5-db25-979b-7584df935cec.png)
キーペアを作成します。ここでは新しいキーペアを作成し、キーペア名を「Qiita_test_keypair」とします。
キーペアをダウンロードし、PCの任意の場所に保存します。
`インスタンスの作成`をクリックします。これでEC2インスタンスの完成です。
![AWS_EC2_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/df75cda8-a367-74de-9523-87a763519df9.png)

###インターネットゲートウェイの作成
このままだとEC2インスタンスがインターネットに接続できないのでVPCにインターネットゲートウェイを追加します。
VPCのコンソールに移動し、インターネットゲートウェイの項目を開きます。
右上の`インターネットゲートウェイの作成`をクリックします。
![AWS_IGW1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/af96f94b-ba38-8007-87cc-acc889f48601.png)
名前タグを「My-IGW」とします。
`インターネットゲートウェイの作成`をクリックします。
![AWS_IGW2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/bb897e0f-b916-b63c-0225-3093fd748fcf.png)
このままだとまだVPCに接続されていないので、右上の`VPCへアタッチ`をクリックします。
![AWS_IGW3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/a0a97505-1bb8-31fa-8a97-d3219c42b5dd.png)
使用可能なVPCに、作成した「My_VPC_1」を選択し、`インターネットゲートウェイのアタッチ`をクリックします。
![AWS_IGW4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/b62df331-1507-7a36-62f6-e3ce7b3c7130.png)
まだVPCがインターネットに向けられていないので、My_VPC_1のルートテーブルを編集します。
ルートテーブルの項目を開きます。My_VPC_1を選択し、`ルートの編集`をクリックします。
![AWS_IGW5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/995ea233-dbf1-7555-9945-f05e69f21192.png)
ルートを追加します。送信先を「0.0.0.0/0」とし、ターゲットを先ほど作成した「My-IGW」を選択します。
`ルートの保存`クリックします。
![AWS_IGW6(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/ecc4bf3a-ef89-0667-9533-e0ff07997d02.png)
これでEC2インスタンスがインターネットにつながりました。SSH接続ができるようになります。

###RDSの作成
####サブネットグループ
RDSのコンソールに移動し、サブネットグループの項目を開きます。
右上の`DBサブネットグループの追加`をクリックします。
![AWS_RDS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/bec73943-3799-6b8f-9fec-9e4e1a2d3eef.png)
名前、説明を「My_Subnet_Grp」とし、VPCを「My_VPC_1」を選択します。
アベイラビリティゾーンを「ap-northeast-1a」「ap-northeast-1c」とし、サブネットは「10.0.3.0/24」「10.0.4.0/24」を選択します。
`作成`をクリックするとサブネットグループが作成されます。
![AWS_RDS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/2ceac4e2-7e83-40ae-0c6a-7d0f9b2a9468.png)

####データベース
データベースを作成します。データベースの項目を開きます。
右上の`データベースの作成`をクリックします。
![AWS_RDS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/c36d4ab6-886e-6561-0e9e-0e7ab3d14c61.png)
「標準作成」を選択します。
**Auroraで検証したい**ので「MySQL」ではなく「Amazon Aurora」を選択します。
![AWS_RDS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/12bcf6f8-bc50-741b-4bab-ae4e0fe46233.png)
WordPressの推奨環境が**MySQL バージョン 5.6 以上**なのでこの条件に合うようにバージョンを選択します。
テンプレートは「開発/テスト」を選択します。
マスターユーザー名を「wordpress」とし、マスターパスワードを入力します。
![AWS_RDS5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/2037d3ec-5430-bccc-8c5a-7a3c8f4b3bf6.png)
DBインスタンスサイズは「バースト可能クラス」、「db.t3.small」を選択します。
Auroraレプリカは作成しません。
VPCは「My_VOC_1」、サブネットグループは「my_subnet_grp」、パブリックアクセス可能は「なし」を選択します。
![AWS_RDS6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/9ad6081d-86d8-b3b7-bba8-ec7bb182a1ab.png)
VPCセキュリティグループは「新規作成」を選択し、セキュリティグループ名は「My-RDS-SG1」とし、アベイラビリティゾーンは「ap-northeast-1a」を選択します。
データベース名は「wordpress」と入力します。
![AWS_RDS7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/3fd8cfc6-17ae-979a-1483-6b2f3f729692.png)
RDSの設定は以上で問題ないので、下へスクロールして、`データベースの作成`をクリックします。

####データベースのセキュリティグループの編集
デフォルトの設定のままだとRDSのセキュリティ面に問題があるので、DBに侵入できるのはWebサーバのみに設定します。
VPCのコンソールに移動し、セキュリティグループの項目を開きます。
My-RDS-SG1を選択し、`インバウンドルールを編集`をクリックします。
![AWS_RDS8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/08fc304f-f10f-4b01-4b2f-a9c9341b25e4.png)
ソースの部分を「Web-SG-1」にして、`ルールを保存`をクリックします。
![AWS_RDS9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/9d114cd6-f25e-abc8-f899-483aa85e3e44.png)

###WordPressのインストール
ではWordPressをEC2インスタンスにインストールしていきます。
執筆者の環境はWindowsなので、TeraTermやRLoginなどのターミナルソフトを使用してもよいのですが、今回はAWSの機能を使ってブラウザ上でログインしていきます。
EC2インスタンスを選択して、上方の`接続`をクリックします。
![AWS_WP1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/2f73a6ab-cf56-429f-fd5e-482208bc68cb.png)
`接続`を押せば接続します。この場合、インスタンスを作成した際に作ったキーペアを用いて公開鍵認証を行うことはありません。
![AWS_WP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/9c0423d7-43b3-ffcf-d387-37f1e7b98987.png)
まずはphpをインストールしてみましょう。

```
[ec2-user@ip-10-0-0-197 ~]$ sudo yum -y install php
```
試しにphpのバージョンを確認してみましょう。

```
[ec2-user@ip-10-0-0-197 ~]$ php -v
PHP 5.4.16 (cli) (built: Oct 31 2019 18:34:05) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```

WordPressの要件がPHPバージョン7.4以上なので、インストールされたものは要件を満たしていないですね。
なのでこうします。

```
[ec2-user@ip-10-0-0-197 ~]$ sudo amazon-linux-extras install php7.4 -y
```

amazon-linux-extrasとはAmazon Linux2で使えるyumコマンドみたいなものです。
詳しくは[こちら](https://aws.amazon.com/jp/amazon-linux-2/faqs/#Amazon_Linux_Extras)。

あとはMySQL、Apache、その他必要なモジュールをインストールします。
php-mbstringは日本語などのマルチバイト文字列を用いる際に必要なモジュール、php-xmlはXMLを扱うのに必要なモジュール、gdはイメージを動的に操作するライブラリ、php-gdはそのGDモジュールです。

```
[ec2-user@ip-10-0-0-197 ~]$ sudo yum -y install mysql httpd php-mbstring php-xml gd php-gd
```

Apacheを起動して、自動起動設定をオンにします。

```
[ec2-user@ip-10-0-0-197 ~]$ sudo systemctl start httpd.service
[ec2-user@ip-10-0-0-197 ~]$ sudo systemctl enable httpd.service
```

WordPressをインストールしていきます。
WordPressのtarballファイルをダウンロードします。
WordPressの公式ダウンロードページは[こちら](https://ja.wordpress.org/download/)。

```
[ec2-user@ip-10-0-0-197 ~]$ wget https://ja.wordpress.org/latest-ja.tar.gz 
```

tarballファイルを展開します。

```
[ec2-user@ip-10-0-0-197 ~]$ tar xvzf latest-ja.tar.gz 
```

展開されたwordpressディレクトリがカレントディレクトリに存在しているので、wordpressディレクトリの中身をApacheのドキュメントルート（/var/www/html）にコピーします[^1]。
[^1]: 執筆者自身はwordpressディレクトリごとコピーしたせいで「index.phpが見つからないヨ」というエラーが出て小一時間潰れたので注意してください。
/var/www/html以下の階層はApache自身のapacheユーザが操作するので、デフォルトの所有ユーザ（rootユーザ）のままでは操作できません。したがって、所有ユーザ、グループをapacheに変更する必要があります。

```
[ec2-user@ip-10-0-0-197 ~]$ sudo cp -r wordpress/* /var/www/html
[ec2-user@ip-10-0-0-197 ~]$ sudo chown -R apache:apache /var/www/html
```

###WordPressの初期設定
EC2インスタンスのパブリックIPアドレスにブラウザからアクセスします。
すると以下のページが表示されます。
`さあ、始めましょう！`をクリックします。
![AWS_WP3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/0a66a559-9759-8fba-c0ef-97c5cd7c24ff.png)
データベース名を「wordpress」、ユーザー名を「wordpress」、パスワードはRDSを作成した際に設定したパスワードを入力します。
データベースのホストは次の画像を参照。
`送信`をクリックします。
![AWS_WP5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/d60174ff-5c3b-3759-62ec-4d9a1ab8a6f9.png)
RDSの作成したデータベースを開きます。database-1-instance-1のエンドポイントをデータベースのホストに入力します。
![AWS_WP4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/374fbfaf-3861-7151-c569-fbda1c68f9ac.png)
`インストール実行`します。
![AWS_WP6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/2a201ffd-5c60-48e6-5509-49cc0c30274f.png)
必要情報を入力して`WordPressをインストール`します。
![AWS_WP7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/7916ccf0-5ebb-ed9b-823d-3668207eb4e2.png)
`ログイン`します。
![AWS_WP8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/85fea744-1cc2-53ad-1071-a509ecbb212f.png)
![AWS_WP9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/d1af283e-8a17-3c25-8754-480835121299.png)
ログインできました。
![AWS_WP10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/caaa7c13-288b-b9b9-6d1e-5aae9bc2c304.png)
動作確認です。適当に記事を投稿して終了。
![AWS_WP11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844185/3207c82d-d52f-6d34-0f36-b2726fb18c1f.png)

##おわりに
動きましたね。
Amazon Auroraは標準的なMySQLと比べて5倍のスループットの性能をがあるので、Amazon Auroraを選ばない理由はないですね。
（追記：料金を度外視すればの話ですが。）

Auroraについてのより詳しい記事
https://dev.classmethod.jp/articles/developers-io-2019-in-osaka-aurora-or-rds/

---
この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com