AWSでウェブアプリケーション環境構築：②RDSでDBを作成し、Laravelサンプルアプリを動かす最小構成を構築

# はじめに
これはシリーズ記事の中の1つです。

[AWSでウェブアプリケーション環境構築：⓪概要](https://qiita.com/minato-naka/items/ddb5f5301f9f590cdcbf)
[AWSでウェブアプリケーション環境構築：①EC2インスタンスにwebサーバを構築](https://qiita.com/minato-naka/items/c21e4d53db7a720f8fdd)
[AWSでウェブアプリケーション環境構築：②RDSでDBを作成し、Laravelサンプルアプリを動かす最小構成を構築](https://qiita.com/minato-naka/items/03f9dbd09eb3919a501f)
**↑↑↑現在の記事↑↑↑**
[AWSでウェブアプリケーション環境構築：③ロードバランサーを作成し、webサーバを冗長化する](https://qiita.com/minato-naka/items/396e2a25ec9a94840a67)
[AWSでウェブアプリケーション環境構築：④ElastiCacheのRedisを作成し、セッション共有可能にする](https://qiita.com/minato-naka/items/76cd5f660d987d34f7be)
[AWSでウェブアプリケーション環境構築：⑤webサーバをプライベートサブネットに配置し、メンテナンス用踏み台サーバを構築](https://qiita.com/minato-naka/items/406c2f247c0d29a93665)
[AWSでウェブアプリケーション環境構築：⑥Route53を利用して独自ドメインでアクセス可能にする](https://qiita.com/minato-naka/items/6f29694c1540f04dedb2)
[AWSでウェブアプリケーション環境構築：⑦ACMを利用してHTTPS通信可能にする](https://qiita.com/minato-naka/items/1a4f03e85857b8f61c4f)
[AWSでウェブアプリケーション環境構築：⑧サーバ負荷に応じてwebサーバがオートスケーリングする仕組みを構築](https://qiita.com/minato-naka/items/c0fab5d9fbb1cce68ac9)


# 前回まで
![1.png](https://qiita-image-store.s3.amazonaws.com/0/297693/98b6c7ca-1b32-5e23-54ff-ae36008598c8.png)


EC2インスタンスにApacheをインストールし、
ブラウザからアクセスしてApacheのテストページが表示されるところまで構築しました。

# 今回構築する環境
![2.png](https://qiita-image-store.s3.amazonaws.com/0/297693/f6f9b58c-dda6-79fb-52c9-7185d5921e1f.png)


前回構築したwebサーバにLaravelサンプルプログラムをのせ、
RDSでDBを作成し、
Laravelサンプルアプリが動作する環境を構築します。

# webサーバにLaravel環境構築
前回作成したwebサーバにSSHログインし、
下記の手順にそってセットアップしていきます。

## PHPインストール
```shell
#PHPインストール
sudo amazon-linux-extras install -y php7.2
#PHP拡張モジュールインストール
sudo yum -y install php-devel php-pdo php-mbstring php-mcrypt php-mysqlnd php-xml php-gd php-opcache php-pecl-zip
```

## Laravelサンプルプログラム取得
```shell
#gitインストール
sudo yum -y install git
#Laravelサンプルアプリをクローン
sudo chmod 777 /var/www/html
git clone https://github.com/laravel/quickstart-intermediate.git /var/www/html/laravel-sample
#Laravelディレクトリパーミッション変更（Laravelが動作するために必要な設定）
cd /var/www/html/laravel-sample
sudo chmod -R 777 bootstrap/cache
sudo chmod -R 777 storage
```

## composer install
```shell
#Composer自体のインストール
cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
#laravel-sample配下でcomposer install
cd /var/www/html/laravel-sample
composer install
```

## Apache設定変更
・ドキュメントルート変更
・リライト有効化
の2つの設定変更を行います。

```shell
#Apache設定ファイルを開く
sudo vim /etc/httpd/conf/httpd.conf
```
これで開いた設定ファイルの下記の2か所を変更します。

```httpd.conf
#↓コメントアウト
#DocumentRoot "/var/www/html"
#↓追記
DocumentRoot "/var/www/html/laravel-sample/public"

###～～略～～###
<Directory "/var/www/html">

    #↓コメントアウト
    #AllowOverride None
    #↓追記
    AllowOverride All
```

Apacheを再起動します。

```shell
sudo systemctl restart httpd
```

これで、Laravel動作用のセットアップは完了です。
ブラウザにサーバのパブリックIPを入力してアクセスし、
この画面が表示されれば正常にセットアップできています。
![screencapture-18-191-154-46-2019-01-24-15_45_54.png](https://qiita-image-store.s3.amazonaws.com/0/297693/450b910e-fde9-73d1-3688-7c10020b94ab.png)


Laravelサンプルアプリ画面右上の[Register]ボタンをクリックしてアカウント登録ページを開き、
任意の値を入力して[Register]ボタンをクリックすると、
PDOExceptionが発生すると思います。
<img width="965" alt="screencapture-18-191-154-46-register-2019-01-24-15_48_43.png" src="https://qiita-image-store.s3.amazonaws.com/0/297693/79488c2e-5257-c93c-b10c-f9f0f8e5e6eb.png">


これは、まだDBが存在しないにもかかわらず
LaravelプログラムがDB接続しようとしているため発生しています。

次にDBを作成するため、
今はこの状態で問題ないです。

# RDSでDB構築
## ネットワーク構築
DB自体を構築する前に、
それを配置するためのネットワークを作成する必要があります。
サーバ構成図にある[private]と書かれたサブネット2つです。
※privateサブネットを2つ作成する理由は後述します。

### privateサブネット作成
マネジメントコンソールの[VPC]のページの
サイドメニューの[サブネット]をクリックし、
上部にある[サブネットの作成]ボタンをクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-vpc-home-2019-01-24-16_15_29.png](https://qiita-image-store.s3.amazonaws.com/0/297693/6ed9e872-eb66-2e62-7c2f-8bacdd60b979.png)


|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|名前タグ|laravel-sample-subnet-private-a|このサブネットの名前。<br>自分が管理するための任意の名前を付ける。|
|VPC|{以前作成した[laravel-sample-vpc]のVPC}|このサブネットが作られるVPC。|
|アベイラビリティーゾーン|us-east-2a|このサブネットが作られるアベイラビリティーゾーン。|
|IPv4 CIDR ブロック|10.0.1.0/24|IPv4 CIDRブロック。<br>実際は、必要なネットワークの大きさを考慮して決定する。|

### privateサブネット2つ目を作成
先ほどと同じようにサブネット作成ページにいき、
下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-vpc-home-2019-01-24-16_22_02.png](https://qiita-image-store.s3.amazonaws.com/0/297693/20cc5331-a44c-7ee9-8222-cffe02ac32ff.png)


|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|名前タグ|laravel-sample-subnet-private-b|-|
|VPC|{以前作成した[laravel-sample-vpc]のVPC}|-|
|アベイラビリティーゾーン|us-east-2b|先ほどのサブネットとは別のアベイラビリティーゾーンにします。|
|IPv4 CIDR ブロック|10.0.2.0/24|-|

### ルートテーブル作成・サブネットに適用
実際にはデフォルトで作成されているルートテーブルのままでも動作に問題ありませんが、
勉強のため、管理のしやすさのために
自分で名前を付けてprivateサブネット用のルートテーブルを作成します。

#### ルートテーブルの作成
[VPC]のページの
サイドメニューの[ルートテーブル]をクリックし、
上部にある[Create route table]ボタンをクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-vpc-home-2019-01-24-16_27_11.png](https://qiita-image-store.s3.amazonaws.com/0/297693/17eaa1ea-049a-0ead-2ed2-8faf012481d2.png)


|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|Name tag|laravel-sample-route-table-private|このルートテーブルの名前。<br>自分が管理するための任意の名前を付ける。|
|VPC|{以前作成した[laravel-sample-vpc]のVPC}|このルートテーブルが作られるVPC。|

#### ルートテーブルをサブネットに関連付け
サブネットの一覧で先ほど作成した[laravel-sample-subnet-private-a]をチェックし、
ページ上部の[アクション]→[ルートテーブルの変更]をクリック。

[ルートテーブルID]に先ほど作成した[laravel-sample-route-table-private]のルートテーブルを設定する。

[laravel-sample-subnet-private-b]のサブネットも同様に
[laravel-sample-route-table-private]のルートテーブルを関連付ける。

### RDS用サブネットグループ作成
この後、RDSでDBサーバを構築するときに、
インスタンスを所属させるためのサブネットグループというものを用意する必要があります。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Subnets
>各 DB サブネットグループには、特定のリージョン内の少なくとも 2 つのアベイラビリティーゾーンにサブネットが必要です。 VPC に DB インスタンスを作成するときに、DB サブネットグループを選択する必要があります。

ここにあるように、
RDSインスタンスを作成する際はサブネットグループを指定する必要があり、
そのサブネットグループを作成するには複数のサブネットを指定する必要があります。
そのため、前の作業で2つのprivateサブネットを作成していました。

[RDS]のページの
サイドメニューの[サブネットグループ]をクリックし、
右上部にある[DBサブネットグループの作成]ボタンをクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-rds-home-2019-01-24-17_21_18.png](https://qiita-image-store.s3.amazonaws.com/0/297693/e75c4884-6521-12d5-7eda-c0bd3a316daf.png)


[サブネットグループの詳細]

|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|名前|laravel-sample-subnet-group|このサブネットグループの名前。<br>自分が管理するための任意の名前を付ける。|
|説明|laravel-sample-subnet-group|任意の説明文。|
|VPC|{以前作成した[laravel-sample-vpc]のVPC}|このサブネットグループが作られるVPC。|

[サブネットの追加]
先ほど作成した
[laravel-sample-subnet-private-a]
と
[laravel-sample-subnet-private-b]
のサブネットを選択し、追加する。


### DB用セキュリティグループ作成
DBサーバに適用するためのセキュリティグループを事前に作成しておきます。

[VPC]のページの
サイドメニューの[セキュリティグループ]をクリックし、
上部にある[Create security group]ボタンをクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-vpc-home-2019-01-24-16_36_47.png](https://qiita-image-store.s3.amazonaws.com/0/297693/7df3ec06-289c-c61e-7c36-ca8ad37455ed.png)


|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|Security group name|laravel-sample-sg-rds|このセキュリティグループの名前。<br>自分が管理するための任意の名前を付ける。|
|Description|laravel-sample-sg-rds|任意の説明文。|
|VPC|{以前作成した[laravel-sample-vpc]のVPC}|このセキュリティグループが作られるVPC。|


作成したセキュリティグループのルールを修正します。

セキュリティグループの一覧で先ほど作成した[laravel-sample-sg-rds]をチェックし、
ページ上部の[アクション]→[Edit inbound rules]をクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-vpc-home-2019-01-24-16_42_04.png](https://qiita-image-store.s3.amazonaws.com/0/297693/1eae1d20-2db1-2f75-e06b-047ac4044b5d.png)


|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|タイプ|MYSQL/Aurora|-|
|ソース|{以前作成した[laravel-sample-sg-web]のセキュリティグループID}|セキュリティグループのソース（アクセス元）は、IPアドレスだけでなくセキュリティグループを指定することも可能。<br>今回はwebサーバの属するセキュリティグループをソースとして指定する。|

この設定で、
webサーバからのMySQL（ポート3306）接続のみ許可するルールのセキュリティグループができました。

## DB構築
Laravelサンプルアプリのデータを格納するための
DBサーバをRDSで構築します。

[RDS]のダッシュボードページにある[データベースの作成]ボタンをクリック。

### エンジンの選択
今回はMySQLを選択します。
また、ページ下部にある[RDS 無料利用枠の対象オプションのみを有効化]にチェックを入れます。
![screencapture-us-east-2-console-aws-amazon-rds-home-2019-01-24-16_54_01.png](https://qiita-image-store.s3.amazonaws.com/0/297693/87b5858c-2c06-f21f-551e-c77e35abee93.png)


### DB 詳細の指定
下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-rds-home-2019-01-24-16_55_37.png](https://qiita-image-store.s3.amazonaws.com/0/297693/e6488bc9-256a-2975-4eb1-842dd96b134f.png)

[インスタンスの仕様]の各項目はすべてデフォルトで問題ないです。


[設定]の各項目は下記のように設定します。

|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|DB インスタンス識別子|laravel-sample-db|インスタンス作成されたときに、DBエンドポイントとして利用される値。|
|マスターユーザの名前|root|DBに作成されるマスターユーザ名。|
|マスターパスワード|{任意のパスワード}|マスターユーザのパスワード。|

マスターユーザの名前とマスターパスワードは、
DBに接続する際に利用する情報なので忘れないようにしてください。

### [詳細設定]の設定
下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-rds-home-2019-01-24-17_30_24.png](https://qiita-image-store.s3.amazonaws.com/0/297693/72689506-34ba-8ff8-dbb9-c003474fae21.png)


下記の項目を間違えないように設定し、
それ以外はデフォルトのままで問題ないです。

|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|Virtual Private Cloud(VPC)|{以前作成した[laravel-sample-vpc]のVPC}|このインスタンスが作られるVPC。|
|サブネットグループ|{先ほど作成した[laravel-sample-subnet-group]のサブネットグループ}|このインスタンスが作られるサブネットグループ。|
|VPCセキュリティグループ|{先ほど作成した[laravel-sample-sg-rds]のセキュリティグループ}|このインスタンスに適用されるセキュリティグループ。|
|データベースの名前|laravel_sample_db|このインスタンスに初期作成されるデータベースの名前。|

[データベースの名前]はDB接続する際に利用する情報なので忘れないようにしてください。


最後に[データベースの作成]ボタンをクリックすれば作成完了です。

# LaravelのDB接続設定
DBサーバの構築が完了したので、
Laravelの設定を変更して
実際にLaravelサンプルアプリでDBに接続します。

## .envの設定変更
webサーバにSSHログインし、
下記の設定を行います。

```shell
cd /var/www/html/laravel-sample
sudo vim .env
```
この.envファイルの下記4項目を変更します。

|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|DB_HOST|{先ほど作成した[laravel-sample-db]のRDSのエンドポイント}|先ほど作成したRDSインスタンスの詳細ページで確認する。|
|DB_DATABASE|laravel_sample_db|先ほど自分で設定したデータベース名|
|DB_USERNAME|root|先ほど自分で設定したDBマスターユーザ名|
|DB_PASSWORD|{先ほど作成した[laravel-sample-db]のマスターパスワード}|先ほど自分で設定したDBマスターパスワード|

## migrationの実行
migrationを実行してみます。

```shell
php artisan migrate
```

これでエラーがでなければ正常にDB接続できています。

## サンプルアプリ動作確認
サンプルアプリの右上の[Register]ボタンからアカウント登録ページにアクセスし、
アカウント登録します。
![screencapture-18-217-195-159-register-2019-01-24-17_49_29.png](https://qiita-image-store.s3.amazonaws.com/0/297693/483d2b62-1f16-ab87-0ccb-bea178c3e406.png)


問題なくアカウント登録できました。
ログイン機能やタスク登録機能も問題なく動作しています。

これで、
RDSでDBを作成し、Laravelサンプルアプリを動かす最小構成が構築完了しました。

# 次回
[AWSでウェブアプリケーション環境構築：③ロードバランサーを作成し、webサーバを冗長化する](https://qiita.com/minato-naka/items/396e2a25ec9a94840a67)