AWS：WordPress構築

# 概要
Udemyの講座である、「AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得」を受講し終えたので、学習内容を振り返ります。

# 手順
* 仮想ネットワーク（VPC）を構築する
* 仮想ネットワークをパブリックサブネットとプライベートサブネットに分割する
* パブリックサブネット上にWebサーバー、プライベートサブネット上にDBサーバー（RDS）を構築する
* WebサーバーからDBサーバーにアクセスする
* WordPress用のデータベースを作成する
* WordPressのインストール・設定

![wordpress_in_aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/6f9224e0-107e-5231-5ea4-3bbb967ae6b6.png)

# VPC作成
## VPCとは？
* Virtual Private Cloud：AWS上の仮想ネットワーク。VPCとサブネットの組み合わせによってネットワーク空間を構築する。
* VPCは単一リージョンに対して作成される。
* 複数のAZにサブネットを設置することで、冗長性を高めることができる。

## VPCの作成
マネジメントコンソールの画面より「VPC」を選択します。

デフォルトでVPCが作成されていますが、今回は新規で作成します。
![vpc_make_vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/6badff30-66c0-4d46-2d70-a04d903953e8.png)
### VPC設計のポイント
* 拡張性を考慮して、VPCの範囲を大きめにとる（後から追加するのは困難）→推奨範囲は/16
* 大きめに作ったVPCをサブネットで分割する
* オンプレミス環境のアドレスと重複しないようにする

## サブネットの作成
VPCのメニュー画面より「サブネット」を選択します。
Webサーバーを設置するパブリックサブネットとDBサーバーを設置するプライベートサブネットを作成します。

### サブネット設計のポイント
* ルーティングとAZを基準にしてサブネットを分割する
* インターネットに接続する必要がある場合はパブリックサブネット
* DBサーバーは外部のネットワークからアクセスされたくないので、プライベートサブネット上に設置する
* 推奨範囲は/24
* 複数のAZを利用して冗長性を高めたい→サブネットを分割する

### パブリックサブネットの作成
まずはWebサーバー用のパブリックサブネットを作成します。
![vpc_public_subnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/38e0698c-15b0-7bf8-c575-2c56ff1002ec.png)
作成画面にあるように、サブネットはAZ単位で作成します。
この段階では、このサブネットはインターネットに接続できません。
後述するように、ルーティング設定でインターネットゲートウェイをアタッチすることでインターネットに接続できるようになります。
つまり、サブネットはデフォルトでは全てプライベートサブネットとして作成されるということです。

### プライベートサブネットの作成
続いてDBサーバー用のプライベートサブネットを作成します。
パブリックサブネットとは違うアドレス範囲を指定します。
![vpc_private_subnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/6b4c8fec-9e54-5860-3704-59022b6ff85a.png)

## ルーティング設定
### インターネットゲートウェイの作成
サブネットをインターネットに接続するには、インターネットゲートウェイが必要です。
VPCから「インターネットゲートウェイ」を選択し、「インターネットゲートウェイの作成」を押下します。
名前を入力して「作成」をクリックすれば作成完了です。
作成後、「アクション」から「VPCにアタッチ」を選択し、作成したVPCに割り当てます。
![vpc_igw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/c7020dea-9f5a-ea34-67be-00c6b02aca53.png)

### ルートテーブルの作成
IPアドレスの接続先を設定していきます。
VPCを作成すると、デフォルトのルートテーブルが作成され、サブネットにはそのルーティング設定が適用されています。
「サブネット」からパブリックサブネットとして作成したサブネットを選択し、「詳細」欄内の「ルートテーブル」をクリックすると、割り当てられているルートテーブルの設定を確認することができます。
デフォルトの設定では、接続先が「10.0.0.0/16」しかない状態だと思います。
この状態ではインターネットに接続することができません。10.0.0.0/16以外の宛先のパケットは全て破棄されてしまう状態だからです。
デフォルトの転送先（デフォルトゲートウェイ）を先ほど作成したインターネットゲートウェイに設定することで、パブリックサブネットはインターネットと接続できるようになります。

左のメニューから「ルートテーブル」をクリックし、「ルートテーブルの作成」をクリックします。
作成画面でルートテーブルの名前（ここではパブリックサブネット用として作成しますので、わかりやすく"public"などつけておきましょう）と対象のVPCを選択し、作成をクリックします。
![vpc_public_routetable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/94d69965-f815-f037-0c18-076436c81db2.png)

次に作成したルートテーブルをパブリックサブネットに割り当てます。
ルートテーブルの一覧から今作成したルートテーブルを選択し、「サブネットの関連付け」タブをクリックします。
「サブネットの関連付けの編集」をクリックすると、サブネットの一覧が表示されるので、パブリック用として作成したサブネットにチェックを入れて、「保存」を押します。
![vpc_routingtable_associate_subnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/9f3f27b8-398c-c82d-477f-5f2d42e13717.png)

続いてデフォルトゲートウェイをインターネットゲートウェイに設定していきます。
パブリック用のルートテーブルを選択し、「ルート」タブから「ルートの編集」を選択します。
「ルートの追加」を選択し、新しい送信先の入力画面で「送信先」を0.0.0.0/0、 ターゲットを作成したインターネットゲートウェイに設定して「ルートの保存」を押します。
![vpc_routingtable_setting_public.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/db33c935-8604-349f-9ef0-244feef4f42b.png)

正しく設定できたか確認しましょう。
「サブネット」からパブリックサブネットを選択し、「ルートテーブル」タブをクリックします。
ルートテーブルにインターネットゲートウェイに転送する接続先が追加されていればOKです。
![vpc_check_routingtable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/87be4581-a1f2-781d-14d4-a39bb18e4d28.png)

# EC2の作成
ここではサーバーの構築を行います。
## EC2とは?
* Elastic Cloud Computingの略
* EC2で立てられたサーバーを「インスタンス」と呼ぶ
* 従量課金
* 「インスタンスタイプ」でサーバーのスペックを定義する

## EC2インスタンスの作成
EC2の画面から「インスタンスの起動」を選択します。
「Amazon Linux 2 AMI (HVM), SSD Volume Type」を選択します。
「インスタンスタイプ」はt2.microを選択し、「インスタンス詳細の設定」に移動します。
詳細設定画面で、先ほど作成したVPCとパブリックサブネットを選択します。
自動割り当てパブリックIPは「有効」を選びます。
ここではWebサーバーを作成します。
ネットワークインターフェイスのプライマリIP欄に10.0.10.10と入力します。
![create_instance_networkinterface.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/e9434111-e4d8-bb8d-65fd-804cee23d1d3.png)

次のステップをクリックし、ストレージの追加設定に移動します。
今回は無料枠の範囲内で設定するため、ストレージの設定はデフォルトのままにします。

次のステップをクリックし、タグの追加に移動します。
タグの追加をクリックし、タグ付けを行います。
Webサーバーであることがわかるよう、適当な名称を設定します。
![create_instance_add_tag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/638dbef1-80fb-1228-e96d-ed9cd951613d.png)

次のステップをクリックし、セキュリティグループの設定に移動します。
「新しいセキュリティグループを作成する」をクリックし、Webサーバー用のセキュリティ設定であることがわかるよう、適当な名称を設定します。
「確認と作成」ボタンをクリックし、内容に問題がなければ「起動」ボタンを押します。

次にインスタンスにアクセスするためのキーペアを作成する画面に移動します。
今回は新規でキーを作成するので、適当な名称を入力し、キーペアをダウンロードします。
なお、ここでPCに保存されるのはサーバーの秘密鍵（.pemファイル）です。
EC2インスタンス側は公開鍵を保持していますので、ログインする際にはこの秘密鍵を使って認証を行います。

これでサーバーを構築することができました。

## SSH接続
作成したインスタンスにSSHでログインします。
以下のようにコマンドを入力してください。

```bash
$ chmod 600 ~/mykey.pem
秘密鍵ファイルへのアクセス権を付与
$ ssh -i ~/mykey.pem ec2-user@xxx.xxx.xxx.xxx
IPアドレスはインスタンスの画面で確認できます
Are you sure you want to continue connecting (yes/no)?
初回接続時のみ表示されるので、ここではyesと入力します
```
ログインに成功すると、以下のような画面が表示されます。
![ec2_instance_ssh_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/8d201c8f-171c-81ae-9ffb-3fd7e834f3c2.png)

## Apacheのインストール
サーバーにログインした状態でコマンドを実行してください。
まずは、インスタンスのパッケージを更新します。

```bash
[ec2-user@ip-10-0-10-10 ~]$ sudo yum update -y
```

続いてApacheをインストールします。

```bash
[ec2-user@ip-10-0-10-10 ~]$ sudo yum -y install httpd
```
Apacheがインストールされたのを確認したら、次のコマンドでApacheを起動します。

```bash
[ec2-user@ip-10-0-10-10 ~]$ sudo systemctl start httpd.service
[ec2-user@ip-10-0-10-10 ~]$ sudo systemctl status httpd.service
起動しているか確認するコマンド。active(running)と表示されれば起動している
```

サーバー起動時にApacheも自動で起動するよう設定します。

```bash
[ec2-user@ip-10-0-10-10 ~]$ sudo systemctl enable httpd.service
[ec2-user@ip-10-0-10-10 ~]$ sudo systemctl is-enabled httpd.service
自動的に起動する設定になっているか確認するコマンド。enabledと表示されればOK
```

## ファイアウォールの設定
AWSでは、インスタンスに対して割り当てるセキュリティグループがファイアウォールとしての機能を果たします。
インバウンド通信（サーバーへのアクセス許可）は必要なものだけ許可し、アウトバウンド通信（サーバーから外部へのアクセス）は全て許可するのが基本となります。
初期設定ではポート22（SSH）しか許可されていないので、HTTP接続（ポート80）はできません。
先ほど作成したインスタンスの設定画面から、当該インスタンスのセキュリティグループ設定画面に移動します。
「インバウンドルールを編集」をクリックし、続いて「ルールの追加」をクリックします。
ここでタイプ：HTTPを選択して設定を保存すると、ポート80を開放することができます。
![ec2_security_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/e73a2087-9c51-3586-0593-7cfd895ba22f.png)

ポート80が開放された状態で、インスタンスのIPアドレスをブラウザのURL欄に入力すると、Apacheのデフォルトページが表示されるようになります。

## Elastic IPアドレスの割り当て
EC2インスタンスのIPアドレスは、デフォルトでは動的に割り当てられます。
つまり、停止・起動の度に異なるIPアドレスが割り当てられます。
Elastic IPアドレスを割り当てることで、インスタンスのIPアドレスを固定することができます。
ただし、Elastic IPアドレスは使用されていない間は料金が発生してしまうので、使用しない場合は「解放」しておくようにしましょう。
「使用していない」とは、次のような状態を指します。
1. 作成したElastic IPアドレスをどのインスタンスにも割り当てていない
2. Elastic IPアドレスを割り当てたインスタンスを停止している

特に2の状態を見落としがちなので注意しましょう。

EC2メニュー内の「Elastic IP」をクリックし、「Elastic IPアドレスの割り当て」をクリックします。
これでElastic IPアドレスを作成できます。

次に、Elastic IPアドレスを割り当てる対象を指定します。
作成したElastic IPアドレスを選択した状態で「アクション」→「Elastic IPアドレス関連付け」をクリックします。
関連付けの設定画面で「インスタンス」を先ほど作成したインスタンスを選択し、プライベートIPアドレス欄に「10.0.10.10」と入力します。
必要事項を入力したら、「関連付ける」をクリックします。
これで、IPアドレスを固定できました。
作成したElastic IPアドレスをブラウザ入力し、Apacheの起動画面が表示されるか確認しましょう。

# RDSの作成
ここでは、AWSの「RDS」というサービスを使って、データベースサーバーを構築します。
EC2インスタンス上に自分でDBMSをインストールして設定する方法もありますが、RDSは「マネージドサービス」なのでアップデートやバックアップなどの管理タスクをAWS側に任せることができ、何かと便利です。

## 2つ目のプライベートサブネットの作成
冗長化のため、プライベートサブネットをもう一つ作成します。
こちらのサブネットは、最初に作成したプライベートサブネット（private-subnet-1a）とは異なるAZに作成します。
![vpc_private_subnet_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/4b00b921-0c04-632d-0f3d-e30170faedcf.png)

## セキュリティグループの設定
データベースサーバーはプライベート領域に設置し、インターネットからのアクセスを遮断することでセキュリティを確保します。
EC2インスタンスからのアクセスのみ許可するよう設定していきます。

EC2のメニューから「セキュリティグループの作成」をクリックし、設定画面に移動します。
名称、説明欄に任意の内容を入力し、VPCは今回作成したVPCを選択します。

続いて、インバウンドルールの設定です。
今回はMySQLを使用するので、タイプを「MYSQL/Aurora」に設定し、ソース欄に先ほど作成したWebサーバーのセキュリティグループを入力します。
これでWebサーバーからデータベースにアクセスできるようになります。
![rds_security_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/db053140-c0d3-39f2-4d47-a50059c13351.png)

## サブネットグループの作成
今回の構成では、冗長化のために複数のAZにRDSを設置します。
これらのプライベートサブネットをまとめるために「サブネットグループ」を作成します。

RDSのメニューから「サブネットグループ」を選択し、「DBサブネットグループを作成」をクリックします。
名称、説明欄には任意の内容を入力し、VPCは今回作成したVPCを選択します。
「サブネットを追加」の欄では、先ほど作成した二つのプライベートサブネット（private-subnet-1aとprivate-subnet-1c）を選択します。
![rds_subnet_group-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/896aa994-ba3f-fb7f-b541-1bab96c9704a.png)
![rds_subnet_group-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/a8c720c4-175d-d879-de03-c1a9c9624661.png)

## パラメータグループの作成
RDSを使用する場合、データベースの設定値（DBMSのバージョンなど）を直接編集することができません。
そのため、パラメータグループというものを使用してデータベースの設定を行います。
RDSのメニューから「パラメータグループ」→「パラメータグループの作成」と移動します。

パラメータグループファミリーで「mysql8.0」と入力し、名称および説明欄には任意の内容を入力します。
![rds_paramgroup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/14d393db-2ac0-0ddd-f794-0cfedab8c90b.png)

後でパラメーターを編集したい場合は、「パラメーターグループアクション」→「編集」と移動すると設定値の編集画面に移動することができます。

## オプショングループの作成
データベースのオプション設定を行います。
名称、説明は任意の内容を入力します。
エンジンはmysqlを選択し、バージョンは8.0を選択します。
![rds_option_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/a87b0008-763a-3ba9-d051-e7f765f1209d.png)

## RDSの作成
RDSのメニューから「データベース」→「データベースの作成」へと進みます。
作成方法：標準を選択し、データベースのエンジンおよびバージョンを選択します。
![rds_createdb_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/f7c09d97-19e5-6b92-b95f-db3ed40e6c6a.png)

料金を抑えるため、テンプレートは「開発／テスト」を選択します。
![rds_createdb_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/b622d34a-4309-659d-cf12-de6f9ee95003.png)

インスタンスの識別子およびデータベースへのアクセス情報は任意の内容を入力します。

続いて、ストレージの容量を設定します。
料金を抑えるため、自動スケーリングを解除しておきます。
![rds_createdb_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/748827e1-8f6e-d4fb-84aa-a666eb755611.png)

次にマルチAZの設定ですが、料金を抑えるため「スタンバイインスタンスを作成しないでください」を選択します。

次に接続設定を行います。
VPCは自分で作成したVPCを選択し、サブネットグループも先ほど作成した物を選択します。
VPC外部からのアクセスは必要ないので、「パブリックアクセス可能」欄はなしを選択します。
![rds_createdb_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/1b374cc5-bd92-67db-e0db-6650630cdbad.png)
セキリュティグループ、AZなどは既に作成済みの物を選択します。
![rds_createdb_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/7aef8fd3-0d61-b793-450b-76c6e34b63c1.png)
追加設定欄では、先ほど作成したパラメータグループ、オプショングループを選択します。
![rds_createdb_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/f94a0027-4fa8-bf58-d240-aded8d35a4de.png)
これ以降の設定内容は任意となります。
![rds_createdb_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/a2ed49ab-1e98-b082-d111-c28f8b75bd3c.png)
![rds_createdb_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1000359/43828891-59c0-f756-d68e-21b8a9ed72a1.png)

必要事項を全て入力したのち、「データベースの作成」をクリックするとRDSを作成することができます。

## WebサーバーからDBサーバーへの接続
WebサーバーからRDSへmysqlコマンドでアクセスできるようにします。
まずは、WebサーバーにMySQLをインストールします。
WebサーバーのIPアドレスを確認し、sshコマンドでサーバーにログインします。
サーバーにログインした状態で下記のコマンドを入力し、EC2インスタンスにMySQLをインストールします。

```bash
[ec2-user@ip-10-0-10-10 ~]$ sudo yum -y install mysql
```

続いてRDSのダッシュボードから作成したRDSのエンドポイントを確認しておきます。
下記のコマンドでMySQLに接続します。

```bash
[ec2-user@ip-10-0-10-10 ~]$ mysql -h {your_endpoint} -u {your_user_name} -p
```
これでデータベースサーバーへ接続できればOKです。

# WordPress構築
## WordPress用のデータベース構築
WebサーバーからデータベースサーバーにMySQLで接続しておきます。
下記のコマンドでデータベースを作成します。

```sql
CREATE DATABASE {your_db_name} DEFAUTL CHARACTER SET utf8 COLLATE utf8_general_ci;
```

作成できているか確認します。

```sql
SHOW DATABASES;
```

WordPress用のユーザーを作成します。
@以降はホスト名を表します。
%は任意のホストから接続可能であることを意味しています。

```sql
CREATE USER '{your_user_name}'@'%' IDENTIFIED BY '{your_password}';
```

ユーザーにデータベースを操作する権限を付与します。

```sql
GRANT ALL ON {your_db_name}.* TO '{your_user_name}'@'%';
```

MySQLに設定の変更を反映させます。

```sql
FLUSH PRIVILEGES;
```

ユーザーの作成に成功したか、確認してみましょう。

```sql
SELECT user, host FROM mysql.user;
```

## WordPressのインストール
まずはWebサーバーにphpをインストールします。

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

php関連のライブラリをインストールします。

```bash
[ec2-user@ip-10-0-10-10 ~]$ sudo yum install -y php php-mbstring
```

Webサーバーのホームディレクトリに移動し、　WordPressをダウンロードします。
ダウンロードしたファイルは圧縮されているので、解凍しておきます。

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

解凍すると、wordpressというディレクトリができるので、wordpress内に移動します。
wordpress内にある全てのファイルをApacheが参照するディレクトリにコピーします。
また、ファイルの所有権をApacheに変更します。

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

Apacheを再起動して設定の変更を反映させます。

```bash
[ec2-user@ip-10-0-10-10 wordpress]$ sudo systemctl restart httpd.service
```

## WordPressを設定する
ブラウザからWebサーバーにアクセスすると、WordPressの初期設定画面が表示されます。
あとは手順に従い、必要な項目を入力します。
データベース名、ユーザー名などはRDSで設定した名前を入力します。
ホスト名はRDSのエンドポイントを入力します。

これ以降の入力項目は、サイト名やログインパスワードの設定など任意の内容となります。
全て入力し、WordPressの管理画面に移行したら作業は完了です。

# 学んだこと
* ネットワーク構築〜サーバー構築までの基本的な手順
* ネットワークの基礎的な知識：IPアドレス、ルーティング、サブネット etc.
* サーバーを操作するための基本的なコマンド：ssh接続、パッケージのインストールおよびアップデート etc.
* ファイアウォール（セキュリティグループ）の設定
* データベースサーバーの構築
* セキュリティ上の理由から、データベースはインターネットに接続しないプライベート領域に作成する