【AWS】王道なインフラ構成でWordpressをデプロイ、運用する Part1 〜wordpressのデプロイ〜

#はじめに

AWSのポートフォリオが作りたくて、王道な構成な感じでワードプレスをデプロイしてみたので、手順をメモしておきます。

最終的に作成したい構成はこんな感じです。

![王道インフラ構築.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/72b9a428-1c5c-b31d-e186-eee4704129ae.png)

#1 ネットワークの設定

まずはVPCでネットワークを構成します。
こんな感じにCIDRを設定して作ってもらえればと思います。

![王道インフラ構築.002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/9f1d16dc-8370-9951-d08c-ab03259f5514.png)

そしたら次にインターネットゲートウェイを作成して、先程作成したVPCにアタッチします。
イメージとしてはこんな感じ。

![王道インフラ構築.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/bba4c330-57c7-8974-4672-4e0f47f7c703.jpeg)

そしたら新たにルートテーブルを作成して、先程のVPCにアタッチして、パブリックサブネットを関連づけます。そして、ルートテーブルのルートを設定して、パブリックサブネットからの通信全て、インターネットゲートウェイをターゲットとします。

![スクリーンショット 2021-08-01 12.26.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/c70f451c-8414-0bf3-1607-578c8acfbad9.png)

これでネットワーク設定は終わりです。
現状イメージはこんな感じです。

![王道インフラ構築.004.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/8455b42b-f33e-a9dd-6f6c-a58a769b460d.jpeg)

#2 EC2でWebサーバ起動

では先ほど作成したパブリックサブネットにEC2でインスタンスを起動します。
自動割り当てパブリックIPは有効にします。
セキュリティグループはSSHとHTTPを許可しておきます。
SSHの接続もとIPアドレスが限定されていれば、そのIPアドレスからのみ接続を許可する設定にするとグッドです。

![スクリーンショット 2021-08-01 12.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/86b0a696-dbbb-034d-acea-4b038d0c8865.png)

また、新たなElastic IPを割り当てて、作成したEC2インスタンスに関連づけておきましょう。
イメージはこんな感じ。

![王道インフラ構築.005.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/d155b0b3-c427-cc8c-4287-60b142ae647e.jpeg)

そしたらSSHでEC2インスタンスに接続します。

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

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-42-200 ~]$ 
[ec2-user@ip-172-31-42-200 ~]$ 
[ec2-user@ip-172-31-42-200 ~]$ 
[ec2-user@ip-172-31-42-200 ~]$ 
[ec2-user@ip-172-31-42-200 ~]$ 
```

時間の設定がUTCになっているので、日本時間に設定し直します。
ちなみに下記手順はAmazon Linux限定ですので、他のOSの場合は各自調べて設定してください。

```
#ZONEをJapanに変更
$ sudo vi /etc/sysconfig/clock
ZONE="Japan"
UTC=true

#ローカルタイムにシンボリックリンクを作成
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime

#設定を反映させるため再起動
$ sudo reboot

#設定が反映されているか確認
$ date
2021年  8月  1日 日曜日 13:08:53 JST
```

そしたらWebサーバとして使うnginxをインストールします。

```
#EC2インスタンスのライブラリをアップデート
$ sudo yum update -y

#インストールできるnginxのバージョンを確認
$ amazon-linux-extras list | grep nginx
38  nginx1                   available    [ =stable ]

#最新のnginxをインストール(上記のものから最新のものを選択)
$ sudo amazon-linux-extras install nginx1 -y

#nginxが自動起動するように設定
$ sudo systemctl enable nginx

#nginxを起動
$ sudo systemctl start nginx

#nginxのステータスを確認
$ sudo systemctl status nginx
Active: active (running)
```

現在イメージはこんな感じ。

![王道インフラ構築.006.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/bb108bdf-158b-7cdd-4465-2844b7f6013a.jpeg)




#3 RDSでデータベースサーバ起動

お次はRDSでデータベースを起動していきましょう。
RDSを作成する前に、以下を作成しなければならないので順に作成していきます。

・RDS用VPCセキュリティグループ
・サブネットグループ

まずRDS用のVPCセキュリティグループ作成します。
VPCのサービスに移動して、左ペインからセキュリティグループを選択して、セキュリティグループを作成します。
VPCは今回作成しているVPCです。
インバウンドルールを以下のように設定します。webサーバからのみアクセスができるようにソースは今回作成したEC2インスタンスのセキュリティグループIDを指定します。

![スクリーンショット 2021-08-01 14.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/44097442-2c9f-0cb6-459c-ad33be0e5923.png)


そしたらサブネットグループを作成します。サブネットグループを作成するには、別々のアベイラビリティゾーンにサブネットが2つ以上存在してないといけないので、同じVPCの別のアベイラビィティゾーンにもサブネットを作成しておきます。

![スクリーンショット 2021-08-01 14.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/f2934e0e-9249-dacb-01e6-458bb4ed4cdc.png)

そしたらサブネットグループを作成します。今回作成したVPCにある2つのプライベートサブネットを選択します。

![スクリーンショット 2021-08-01 14.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/1e330f66-e33f-d034-4d21-3b79c7eb2d7c.png)


セキュリティグループとサブネットグループの作成が完了したら、RDSサービスからデータベース作成をして、今回作成したもの選んでいけば、データベースを作成できます。

現在イメージはこんな感じ。

![王道インフラ構築.006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/a40b9d7d-d430-3ab3-1ec4-6b7786f028bb.png)

EC2インスタンスからデータベースに接続します。

```
#MySQLのインストール
$ sudo yum -y install mysql

#EC2インスタンスからデータベースに接続
$ mysql -h データベースのエンドポイント -u admin -p
パスワード：

#データベースの確認
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| qii_wp_database    |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```

ワードプレス用のデータベースの作成、ユーザーの作成と権限の設定もやっていきます。

```
#ワードプレス用データベース作成
create database 任意のデータベース名 default character set utf8 collate utf8_general_ci;

#ワードプレス用ユーザーの作成
MySQL [(none)]> create user '任意のユーザー名'@'%' identified by '任意のパスワード';
Query OK, 0 rows affected (0.01 sec)

#ワードプレス用ユーザーにワードプレス用データベースへの権限を付与
MySQL [(none)]> grant all on 作成したデータベース名.* to '作成したユーザ名'@'%';
Query OK, 0 rows affected (0.01 sec)

#設定を反映
MySQL [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
```

#4 Wordpressの設定

ワードプレスを動かすにはphpも必要なのでインストールします。

```
#インストールできるphpのバージョンを確認
$ amazon-linux-extras list | grep php
 15  php7.2                   available    \
 17  lamp-mariadb10.2-php7.2  available    \
 31  php7.3                   available    \
 42  php7.4                   available    [ =stable ]
 51  php8.0                   available    [ =stable ]

#phpの最新バージョンをインストール(上記のリストから最新のものを選択)
sudo amazon-linux-extras install php8.0 -y

#必要なphpライブラリをインストール
$ sudo yum install php php-mbstring -y
```

そしたらワードプレスもインストールしましょう。

```
#ワードプレスをインストール
$ wget https://ja.wordpress.org/latest-ja.tar.gz

#ワードプレスのアーカイブを展開
$ tar xzvf latest-ja.tar.gz

#インストールできたことを確認
$ ll
合計 15456
-rw-rw-r-- 1 ec2-user ec2-user 15819383  7月 26 09:01 latest-ja.tar.gz
drwxr-xr-x 5 ec2-user ec2-user     4096  7月 26 09:00 wordpress
```

インストールが完了したので、httpアクセスをした時にnginxがワードプレスを表示できるように、適切な位置にワードプレスファイルを配置しましょう。

```
#wordpresディレクトリに移動
$ cd ~/wordpress

#カレントディレクトリ配下にワードプレスファイル群があることを確認
ls
index.php    readme.html      wp-admin            wp-comments-post.php  wp-content   wp-includes        wp-load.php   wp-mail.php      wp-signup.php     xmlrpc.php
license.txt  wp-activate.php  wp-blog-header.php  wp-config-sample.php  wp-cron.php  wp-links-opml.php  wp-login.php  wp-settings.php  wp-trackback.php

カレントディレクトリ配下を/usr/share/nginx/htmlに配置
$ sudo cp -r ./* /usr/share/nginx/html

#/usr/share/nginx/html配下のオーナーをapacheに変更
$ sudo chown apache:apache /usr/share/nginx/html/ -R

#nginxを再起動
$ sudo systemctl restart nginx
```

これでイメージはこんな感じ

![王道インフラ構築.007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/fd19abae-6a1e-14b0-0e8c-eb1e87f21572.png)

ブラウザでインスタンスにアクセスすると、ワードプレスのインストール画面が表示されます。

![スクリーンショット 2021-08-07 12.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/e76f8064-be02-f36a-3c50-68f519d54782.png)

左下の「さあ、始めましょう」ボタンをクリックすると、データベースの詳細入力画面が表示されます。

![スクリーンショット 2021-08-07 12.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/2751b306-90d6-8b05-aa07-9649aea4db3a.png)

データベース名、ユーザ名、パスワードは先ほど作成したものを入力します。
データベースのホスト名は、RDSインスタンスのエンドポイントを入れます。

そしてサイトの必要情報を入力して、インストール実行をすると、ワードプレスのダッシュボード画面に入ることができます。

![スクリーンショット 2021-08-07 12.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/e2b3591e-563f-c1fa-ac69-2c07f6c71662.png)


#5 S3にメディアファイルを保存できるように設定

それでは最後に、ワードプレスのメディアファイルをS3に保存できるようにしましょう。
メディアファイルはワードプレスの記事を書くごとに増えていくので、サーバのストレージを圧迫しがちです。
S3に保存すれば、容量制限がないので、ストレージを拡張する必要がなくなり、大変便利です。

まずはS3バケットを作成します。
設定の際に、パブリックアクセスのブロック設定のチェックを全て外しておきます。
これをやっておかないと、ブログの画像に読者がアクセスできなくなります。

![スクリーンショット 2021-08-07 13.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/338cd14f-697f-7353-8442-95f7ef6ace45.png)

そして、s3バケットの作成が完了しました。

![スクリーンショット 2021-08-07 13.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/d5b95feb-5f73-1b1a-f116-a76c3d0a094c.png)

そしたらS3を操作できるIAMユーザーを作成します。
ユーザー名を入力して、プログラムからのアクセスにチェックを入れて、次へを選択します。

![スクリーンショット 2021-08-07 13.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/914c61f4-bfcf-f867-df3f-46c4619f9fe2.png)

既存のポリシーをアタッチから、「S3 Full Access」のポリシーをユーザーにアタッチします。

![スクリーンショット 2021-08-07 13.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/f23198c0-2aeb-ecf7-8448-4384414b16b9.png)


そしたら、ワードプレスのダッシュボードで、「WP Offload Media Lite for Amazon S3」というプラグインを新規追加して、有効化させます。

![スクリーンショット 2021-08-07 13.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/ee9da492-b3ee-307e-8764-23d71ce6ffad.png)

ユーザー作成の確認画面はこんな感じです。

![スクリーンショット 2021-08-07 13.35.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/8b6302d0-acb4-e585-83d8-011a2b39c9cf.png)

ユーザーのアクセスキーIDとシークレットアクセスキーが発行されるので、csvをダウンロードしおきましょう。

![スクリーンショット 2021-08-07 13.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/d8c42a4e-2ead-afd4-d3fc-b0379b874c3a.png)

そしたらEC2インスタンスで、必要なライブラリをインストールします。

```
#php-xmlをインストール
$ sudo yum install -y php-xml

#php-gdをインストール
$ sudo yum install -y php-gd

#php-develをインストール
$ sudo yum install php-devel.x86_64

#サーバ再起動
$ sudo reboot
```

そしたらワードプレスのダッシュボードに戻って、左ペインの設定に「Offload Media Lite」が追加されていることを確認します。

![スクリーンショット 2021-08-07 13.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/fd0444a6-ae65-2049-9145-22c2894f5e2d.png)

Offload Media Liteをクリックしたら、「Define access keys in wp-config.php」の欄にコードがあるので、それをコピーしてEC2インスタンスの「wp-config.php」に記載します。

アクセスキーIDとシークレットアクセスキーは先ほどダウンロードしたCSVのものを入力しましょう。

```
$ sudo vi /usr/share/nginx/html/wp-config.php

↓↓↓↓↓↓↓↓↓viの編集画面↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

define( 'WP_DEBUG', false );

define( 'AS3CF_SETTINGS', serialize( array(
    'provider' => 'aws',
    'access-key-id' => '********************',
    'secret-access-key' => '**************************************',
) ) );

/* カスタム値は、この行と「編集が必要なのはここまでです」の行の間に追加してください。 */
```

そしたらワードプレスの「Offload Media Lite」設定画面に戻って画面をリロードすると、S3バケットを入力する画面が表示されるので、先ほど作成したS3バケットのバケット名を入力して保存します。

![スクリーンショット 2021-08-07 13.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/1f2a3cba-9a66-707d-5373-5856f86285a5.png)

また「Offload Media Lite」の設定で「Remove Files From Server」をONにしておきましょう。この設定をすることで、サーバの容量が逼迫しなくなります。

![スクリーンショット 2021-08-07 13.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/073ea883-6257-0d81-899f-0a3e640c265f.png)

これでワードプレスから画像を投稿すると、S３バケットに保存されます。
ワードプレスで画像をアップロードして、画像のURLを見るとS3に保存され、S3から配信されていることが確認できます。

やっとこさ最初に想定したイメージにたどり着きました！
現状イメージはこんな感じ。

![王道インフラ構築.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837136/20358678-e14a-3f0a-b9d0-69b2bc399aea.png)

お疲れ様です！
これでワードプレスの構築は以上となります！

次回はAWSの設定をいじって、運用を自動化していきます！

それでは、どうぞよしなに