初心者でも試せる！AWS上でwordpress構築方法

# 概要
AWSを使うと様々なメリットがありますよね。
根本的なインフラの管理やAPIを使って簡単にインスタンスを作成したりなど・・・。

サーバーサイドエンジニアとして最近AWSを使い始めたのですが、ECS + ECR を用いたDocker環境等...を触ることが多くあります。

思い返してみると素のEC2等をあまり触ったことが無いので、初心に振り返ってみようと思ったのがこの記事を書くきっかけです。
純粋な `EC2 + ELB + RDS + Route53` という構成でwordpressを用いて、ブログサイトの環境構築をしてみました。

※ 基本的に無料枠で作っているけど、使用状況に応じてインスタンスタイプの変更をしたほうがよい。
※ この記事ではRDSは一台構成でつくっていますが、必要に応じてクラスタ構成を組んで読み取り専用エンドポイントを
ReadOnlyとして使用するように設定すると尚よし。

# 完成予定図
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/4c149cb1-8b14-0a19-6b4c-725523e9ae2d.png)
①ユーザーがインターネットを通じてアクセスする経路
②EC2にアクセスを振り分けるELB（ロードバランサー）
③アクセスを処理するEC2インスタンス（Apache, PHP + Wordpressが動作）
④RDSインスタンス（MySQL5.7）
⑤Route53（DNSサービスの提供）

これらを順番に作っていく

# VPC(Amazon Virtual Private Cloud)の設定

### VPCの作成
`①ユーザーがインターネットを通じてアクセスする経路` で `①→②`という形でインターネットを介してELBにアクセスする経路となる。

この際、②のELBを作成する必要があるが、先にVPCを作成する必要がある。
（VPCはELBやEC2、RDSなどを置く場所のようなものと捉えると理解が進むと思う）

①サービスからVPCを選択して、【VPCの作成】を押下
②test-ip1と記入する
③IPv4 CIDR ブロックに有効なIpv4 CDIRを入力(例: `10.0.0.0/16` で一旦設定)
④作成ボタンを押下
⑤IPv6 CIDR ブロック・テナンシーは必要がなければデフォルトのまま
IPv4 アドレスの範囲を Classless Inter-Domain Routing 
(CIDR) ブロックの形式で指定する必要があります (例: 10.0.0.0/16)。

<img width="1258" alt="VPC_の作成___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/3e9fe3d1-800f-e079-51f9-098a89cfc0b9.png">

### サブネットの作成
①サービスからVPCを選択して、メニューからサブネットを選択後、【サブネットの作成】を押下
②名前タグに`test-public-subnet-1a`と入力
③VPCに先程作成したVPCを選択
④アベイラビリティーゾーンは`ap-notrtheast-1a`を選択
⑤IPv4 CIDR ブロックに10.0.10.0/24を入力
⑥もう一度サブネット作成を押下し名前タグに`test-private-subnet-1a`と入力。④は同じものを選択
⑦IPv4 CIDRに10.0.20.0/24を入力
⑧もう一度サブネット作成を押下し名前タグに`test-private-subnet-1c`と入力
⑨アベイラビリティーゾーンは`ap-notrtheast-1c`を入力

<img width="1252" alt="サブネットの作成___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/d29a734f-6dae-4fe8-6e2d-9a23afe1b5f2.png">

参考: https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html

### ルーティングの設定
①サービスからVPCを選択し、メニューからインターネットゲートウェイを選択しインターネットゲートウェイの作成を押下
②名前タグに`test-internet-gateway1`と入力し作成ボタンを押下
③作成されたインターネットゲートウェイのチェックボックスを押下する
④アクションからVPCにアタッチを選択し、先ほど作成したVPCの`test-ip1`を選択し、アタッチボタンを押下

<img width="1255" alt="インターネットゲートウェイの作成___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/0716db94-01bd-8c17-b998-766761520be8.png">

<img width="1253" alt="インターネットゲートウェイ___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/f6b79936-062c-12ff-2c33-7e94db40b767.png">

### ルートテーブルの作成
①サービスからVPCを選択し、メニューからルートテーブルを選択
②ルートテーブルの作成を押下し、名前タグに`test-public-route-table1`と入力
③VPCは作成した`test-ip1`を選択

<img width="1252" alt="ルートテーブルの作成___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/227fb58f-8873-dc18-0eb4-dec120ea45b4.png">

④作成された`test-public-route-table1`のチェックボックスを押下し、サブネットの関連付けタブを押下し`サブネット関連付けの編集`を押下

<img width="1234" alt="ルートテーブル___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/b4fe49ac-47e2-bf22-712a-3175962dc52f.png">

⑤作成した`test-public-subnet-1a`,`test-private-subnet-1a`,`test-public-subnet-1c`を選択し、作成ボタンを押下する

<img width="1250" alt="サブネットの関連付けの編集___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/36208b8a-4cb6-6b15-a5f1-6fd96e25afec.png">


⑥`test-public-route-table1`のチェックボックスを再度押下し、ルートタブから`ルートの編集`を押下
⑦`ルートの追加`を押下
⑧送信先に`0.0.0.0/0`、ターゲットはInternet Gatewayを選び`test-internet-gateway1`にする

<img width="1229" alt="ルートテーブル___VPC_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/4f5e46b6-3766-82f6-708d-a8ec8df4edc2.png">

# EC2インスタンスのセットアップ

②→③の流れでユーザーはWordpressにアクセスする。
②のロードバランサーは、EC2インスタンスが無いと設定できないので、③のEC2インスタンスを先にセットアップする。

①サービスからEC2を選択し、 `インスタンス作成`ボタンを押下
②AMI(Amazon Machine Image)は クイックスタートから無料枠のAmazonLinuxを選択
③インスタンスタイプは無料枠のt2.microを選択（動作確認くらいなのでこれで一旦進む※）
④`インスタンスの詳細の設定` を押下し、下記のテーブルの項目は変更する

| 項目 | 内容 |
|---|---|
| ネットワーク | VPCで作成したものを選択 |
| サブネット | VPCで作成したものを選択 |
| ストレージサイズ | 8Gb ボリュームタイプ: 汎用SSD |
| Key: Name | `テストインスタンス01`（作成するEC2インスタンスの名前）|
| 自動パブリック割り当てパブリック | 有効 |

⑤ `ストレージの追加` を押下
⑥ `タグの追加` を押下し、 `タグの追加` を押下し、下記のように入力

| 項目 | 内容 |
|---|---|
| キー | Name |
| 値 | テストインスタンス01 |

⑦ `セキュリティグループの設定` を押下
⑧ 下記のように作成する。ルールの追加を押下して、ルールも追加する

| 項目 | 内容 |
|---|---|
| セキュリティグループ名 | wordpress-access |
| 説明 | wordpress-allow-access |

⑨ ルールの追加 を押下し、下記のようなルールを作成する

| タイプ | プロトコル | ポート範囲 | ソース | 説明 | 
| --- | --- | --- | --- | --- |
| SSH | TCP | 22 | 0.0.0.0/0 | |
| HTTP | TCP | 80 | 0.0.0.0/0 | |

※IPアドレスは適切な範囲から絞り込んでください。今回は検証のためにセキュリティはあえて強固にしていません。

⑩ `確認と作成` を押下
⑪ `起動` を押下
⑫ `新しいキーペアの作成` を押下し、 キーペア名に `wordpress` と入力
⑬ `キーペアのダウンロード` を押下 ※この時ダウンロードしたファイルは後で使います
⑭ `インスタンスの作成` を押下

ここまでで EC2インスタンスの起動が完了。
冗長構成にするため[こちら](# EC2インスタンスのセットアップ)をからもう一台インスタンスを設定する

## apacheのインストール
① EC2にログイン

```console.bash
ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117
```

```
➜  ~ ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117
Last login: Mon Nov 11 11:47:42 2019 from zz20194022436f572964.userreverse.dion.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
12 package(s) needed for security, out of 27 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-10-10 ~]$
```
②EC2インスタンスのライブラリをアップデートしおく

```
sudo yum update -y
```
③apacheをインストール

```
sudo yum install -y httpd
```
④apacheを起動

```
sudo systemctl start httpd.service
```

## ファイアーウォールの設定
①コンソール画面からEC2を選択し、インスタンスから`test-instance01`を選択
②セキュリティグループに記載されているインスタンス名をクリックし`インバウンド`タブを押下
③`編集ボタン`を押下し、`ルールの追加`から`HTTP`を選択`ポート番号`は80のまま
ソースを`任意の場所`に変更し`保存`を押下




## EC2インスタンスにsshして `wordpress`, `apache` の起動

### sshで接続する

AWSコンソール上で、作成したEC2インスタンスを選択すると画面下部の詳細で下記のように表示される

<img width="1033" alt="スクリーンショット 2019-11-11 1.02.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/45100c21-594d-60a4-16a3-ce55e64a90ae.png">

この赤枠のIPアドレスに対して ssh接続を行う。
下記以降、EC2インスタンスに接続するIPアドレスは `52.194.253.117` としてアクセスするが、適宜自分自身のIPアドレスに置き換えてください。

① sshで接続する ※1

```console.bash
ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117
```

※1: `~/Downloads/wordpress.pem` の部分は、[こちら](# EC2インスタンスのセットアップ)の⑬で作成したファイルを指定する

②下記のような画面となれば、 ssh接続は完了

```
➜  ~ ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117
Last login: Mon Nov 11 11:47:42 2019 from zz20194022436f572964.userreverse.dion.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
12 package(s) needed for security, out of 27 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-10-10 ~]$
```

③ rootユーザーに切り替えておく

```
sudo su -
```
### PHPのインストール

①PHPのインストールコマンドをたたく

```console.bash
sudo amazon-linux-extras install -y php7.2
```

```console.bash
sudo yum install -y  php php-mbstring
```

### wordpressのインストール

① wgetコマンドでファイルを取得する

```console.bash
wget https://ja.wordpress.org/latest-ja.tar.gz
```

② 次のように表示され、ダウンロードが完了する

```
[ec2-user@ip-10-0-10-10 ~]$ wget https://ja.wordpress.org/latest-ja.tar.gz
--2019-11-11 11:57:07--  https://ja.wordpress.org/latest-ja.tar.gz
ja.wordpress.org (ja.wordpress.org) をDNSに問いあわせています... 198.143.164.252
ja.wordpress.org (ja.wordpress.org)|198.143.164.252|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 11838159 (11M) [application/octet-stream]
`latest-ja.tar.gz.1' に保存中

100%[==================================================================================================================>] 11,838,159  5.51MB/s 時間 2.0s

2019-11-11 11:57:10 (5.51 MB/s) - `latest-ja.tar.gz' へ保存完了 [11838159/11838159]
```

④ tarコマンドで解凍

```
tar xzvf latest-ja.tar.gz
```

⑤ `/var/www/html` にファイルコピー

```
cp -r wordpress/* /var/www/html/
```

⑥ chown コマンドでファイルの所有権を変更

```
chown -R apache:apache /var/www/html/
```

⑦ apache を起動させる

```
systemctl restart httpd.service
```

※ `restart`だと、止まってても起動してても、再度起動がかかる

⑧ ここまでで、WEBページにアクセスすると wordpressの設定画面が見れるようになる

著者の場合: `http://52.194.253.117/wp-admin/setup-config.php`

# wordpressで使用する RDSの設定

③→④の部分。
EC2インスタンスがRDSにSQLを送信してその結果を画面に返すような構成にしたい。
そのためにRDSの設定と、EC2インスタンスにRDSの接続先情報を設定する
①サービスから`RDS`を選択し、データベースの作成を押下
②データベース作成方法を選択で`標準作成`を選択
③　`エンジンのオプション`で`MySql`、Mysqlバージョンは安定バージョン(筆者は5.7系を選択)
④テンプレートでは今回は`無料利用枠`を指定する
⑤DB インスタンス識別子に`test-database-01`と記載
⑥認証情報の設定でDBにログインする際のユーザー名、パスワードを設定する
⑦`接続`は[こちら](### VPCの作成)で作成したVPCを選択
⑧追加の接続設定で
⑨その他はデフォルトのままで`データベース作成`を押下

# wordpressを冗長構成にする

③の部分を見ると、EC2インスタンスが1台しか存在していない。
つまり、EC2インスタンスが1台障害等で使えなくなってしまった場合、このブログサイトはダウンしてしまう。
それを防ぐために複数のEC2インスタンスでwordpressを稼働させ、②のロードバランサーを使ってホットスタンバイかつ、ラウンドロビンを用いて冗長構成にする

ホットスタンバイ
https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%90%E3%82%A4

冗長構成
http://e-words.jp/w/%E5%86%97%E9%95%B7%E6%A7%8B%E6%88%90.html

# wordpressにログイン
①EC2で作成したインスタンスの`説明`情報からIPv4 パブリック IPを確認し、新規タブでアクセスする
②Wordpressの画面が表示されるので`さあ始めましょう`ボタンを押下
③下記画面が表示されるので情報を記載する

<img width="954" alt="wordpress-login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/15cd2a1b-97fc-baf5-655b-2d983743e22e.png">

④データベースのホスト名には下記のRDS作成したDBのエンドポイントを記載する

<img width="1241" alt="エンドポイント.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/6ec1121b-08ff-cf34-5c26-e86f7a860296.png">

# DNSの設定を行う

現在wordpressにアクセスしようとすると、IPアドレスでのアクセスとなる。
著者の場合: `http://52.194.253.117`

IPアドレスでアクセスするサイトは基本的に稀で、一般的にはドメインが使われます。
そのため、ドメインを用いてアクセスできるようにします。

①サービスからRoute53をクリックし、メニューから`登録済みのドメイン`を選択
②`ドメインの登録`を押下
③取得したいドメインを入力し、トップレベルドメインを選び、チェックボタンをクリックし、使用できるドメインを`カートに入れる`を押下し、最下部の`続行`を押下。
④個人情報を入力し、`続行`を押下
⑤`ドメインを自動的に更新しますか?`は、お試しであれば`無効化`がおすすめ。
⑥規約に同意し、`注文を完了`を押下。

※ ⑥を完了すると認証メールが登録したメールアドレスに届くのでメールを確認してリンクをクリックし認証しておく

ドメイン
https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D

DNS
https://ja.wikipedia.org/wiki/Domain_Name_System

## ELBの設定

### ELB作成ステップ１

①サービスからEC2を選択し、メニューから`ロードバランサー`をクリック
②`ロードバランサーの作成`をクリックし、`Application Load Balancer`の`作成`を押下
③名前に`test-lb-01`を入力する
④`リスナーの追加`をクリックし、以下をHTTPの設定を削除し追加する

| ロードバランサーのプロトコル | ロードバランサーのポート|
| --- | --- |
| HTTPS | 443 |

⑤ 作成したVPCを選択しアベイラビリティゾーン最低2つ選択(作成したサブネットをそれぞれ選択)し、次の手順へすすむ
⑥`ACM　から新しい証明書をリクエスト`というリンクが出ているのでそのリンクをクリック

### ACMでELB設定用の証明書作成

①ドメイン名に[こちら](# DNSの設定を行う)で購入したドメインを入力し、`次へ`を押下
②`DNS の検証`を選択し`確認`を押下
③`確定とリクエスト`を押下
④`Route53でのレコード作成`を押下する(Route53にCNAMEが登録される)

<img width="944" alt="domain_route53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/4427c7f6-bd8a-9ff7-ae70-9caf8156fb04.png">

<img width="1057" alt="Route_53_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/601efd09-6ec9-0f65-76b0-d445a91bd76b.png">

### ELB作成ステップ2

①下記にある`更新`部分のボタンを押下し、作成したドメインの証明書が表示されたことを確認し、次の手順へ進む

![elb_acm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/a50fbdab-7f9b-b993-eb9c-e3d68dc179a1.png)

②セキュリティグループの設定で`新しいセキュリティグループの作成する`を選択
③セキュリティグループ名と説明を入力し次の手順へすすむ(他はデフォルトでOK)
④ルーティングの設定で名前に`test-target-group01`と入力し、次へ
⑤下記の図を参照(EC2インスタンスを2台作成しているので2つのインスタンスを登録済みにする)

![target.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/3783f9e0-e5d8-1ebb-d991-d3df35a31d15.png)

⑥`確認`を押下し、`作成`を押下

### Route53でAレコードの設定

①`レコードセットの作成`を押下し、タイプを`A-IPv4アドレス`、エイリアスを`はい`にする
②エイリアス先のターゲット名の入力欄をクリックし、`ELB Application Load Balancer`で作成したろーELBを選択する
③レコードセットの保存を押下

<img width="1257" alt="Route_53_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/2cd71568-f0d2-59b4-19c1-524e6a49a680.png">

### 確認
①ロードバランサーの一覧画面に遷移して、DNS名をコピー

![lb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/ba82f72c-9013-b5bc-3086-5fb09d7b301e.png)

②新しいタブを開き、DNS名をペーストしWordpressの画面がでてきたらOK
③購入したドメインでも接続を試してみてWordpressの画面が表示されればOK

## WordPressにCSSがあたらない
ELBを介すると、WordpressのCSSが上手く当たらないため対策を入れなければいけない

<img width="861" alt="test-title_–_Just_another_WordPress_site.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/80d88e70-31e2-a404-abed-200f1a9c91f3.png">


①以下のコードをfunctions.phpに追記する

```/var/www/html/wp-includes/functions.php
class relative_URI {
    function relative_URI() {
        add_action('get_header', array(&$this, 'get_header'), 1);
        add_action('wp_footer', array(&$this, 'wp_footer'), 99999);
    }
    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        return str_replace($home_url, '/', $content);
    }
    function get_header(){
        ob_start(array(&$this, 'replace_relative_URI'));
    }
    function wp_footer(){
        ob_end_flush();
    }
}
new relative_URI();
//↑ここまでをコピペ

require( ABSPATH . WPINC . '/option.php' );
```
②apacheの再起動

```console.bash
systemctl restart httpd.service
```

③再度ドメインにアクセスし、表示が問題なければOK
参照: https://dogmap.jp/2011/03/18/wordpress-relative-url/
<img width="1247" alt="test-title_–_Just_another_WordPress_site.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/f06cd2d7-0488-03d2-a921-2b8a4149954b.png">

# 完成

ここまでで、ELBによってロードバランシングされ、冗長構成な wordpressの作成が完了です。
データベースはRDSが使用され、ドメインもRoute53で管理されている、全てAWSを使ってwordpressのインフラを構築してみました。

## 完成図
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/a6ce9649-04aa-b632-75e9-ad2bc3b5d04e.png)

# 感想
AWSの管理画面をポチポチするだけでサーバやロードバランサー、DBなどの設定を簡単にできる。
ただ、ネットワークの知識とか基礎的なものがないと操作わかっていてもあいまいなところがあるので勉強は必要だなと感じた。