EC2・RDSでLaravelの環境構築【PHP・MySQL・Nginx】

## 実現したいこと
既存で作成したLaravelのWebアプリケーションをEC2・RDSの環境にデプロイすることです。

## 前提

- GitHubに自身で作成したLaravelのWebアプリケーションがリポジトリに上がっている
- Laravel6.1
- PHP7.3
- MySQL5.7.31
- Nginx1.17.10

## EC2

### EC2の作成

#### ステップ 1: Amazon マシンイメージ (AMI)

![スクリーンショット 2020-09-07 7.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/df71e48e-b5bf-e63a-681b-91601dfce49d.png)

- Amazon Linux 2 AMIを選択

#### ステップ 2: インスタンスタイプの選択

![スクリーンショット 2020-09-09 8.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/a10c7adc-7ed2-fefb-2def-1ba44410462c.png)

- t2.micro

#### ステップ 3: インスタンスの詳細の設定

![スクリーンショット 2020-09-07 7.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/d9a9e67c-916c-f72c-b06a-3b96a57bc17e.png)

- 全てデフォルト

#### ステップ 4: ストレージの追加

![スクリーンショット 2020-09-07 7.55.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/01d60764-7781-db0c-4f1e-80742de2927f.png)

- 全てデフォルト

#### ステップ 5: タグの追加

![スクリーンショット 2020-09-07 7.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/809db01e-992e-abbf-8fcf-c4854d6d0855.png)


- キー Name
- 値　適宜好きな名前

#### ステップ 6: セキュリティグループの設定

![スクリーンショット 2020-09-07 7.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/73bdd01f-1d00-47bd-c4e3-0d502a885b06.png)

- ルールの追加
    - SSH *アクセス元を絞るため、ソースをマイIPを選択しましょう。
    - HTTP

#### ステップ 7: インスタンス作成の確認

![スクリーンショット 2020-09-09 8.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/d38f2b23-0cb6-22f7-c158-4abb9b59a868.png)

- 起動

![スクリーンショット 2020-09-09 8.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/da12898d-06f2-f48c-92bc-9aa35bba89d6.png)

- キーペアの作成 *すでに作っているなら既存のキーペアを使用しましょう。ECSにSSHでログインする際に必要になります

### SSHで接続

![スクリーンショット 2020-09-09 8.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/d9c812f8-54a9-fb2d-c597-b0775d52cc1c.png)


1. キーペアファイルを配置
2. アクセス権を400に設定
3. 接続 ```ssh -i ~/.ssh/[SHHキー.pem] ec2-user@[ドメイン名かIPアドレス(パブリック DNS (IPv4))]```

■参考記事
[MacのターミナルでEC2にSSHでログインする](https://qiita.com/ai-2723/items/eb156cd4dd3ccfac8791)

### Nginxのインストール

yum update

```
$ sudo yum update -y
```

Nginxをインストール
*適宜、ローカルのバージョンに合わせてインストールしてください。

```
$ sudo amazon-linux-extras install nginx1.12 -y
```

Nginxを起動

```
$ sudo systemctl start nginx
```

IPv4パブリックIPをブラウザに入力すると下記の画面が表示されます。

![スクリーンショット 2020-09-09 8.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/2a116943-bd55-334b-7bf1-9ac9381f4634.png)

### PHPのインストール

PHPのインストール
*適宜、ローカルのバージョンに合わせてインストールしてください。

```
$ sudo amazon-linux-extras install php7.3
```

下記のコマンドでインストールされているか確認

```
$ php -v
```

Nginxを使用するため、PHPの設定情報を変更

```
$ sudo vi /etc/php-fpm.d/www.conf
```

```/etc/php-fpm.d/www.conf
# 略
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx # デフォルトは「user = apache」
; RPM: Keep a group allowed to write in log dir.
group = nginx　# デフォルトは「user = apache」
# 略
```

Nginxを再起動

```
$ sudo systemctl restart nginx
```

■参考記事
[AWS EC2 + nginx + Laravel + RDS(PostgreSQL)の環境を構築する](https://qiita.com/shonansurvivors/items/7b0e3f6b78be66027028)

### Laraveのリポジトリをclone


#### Composer

Composerをインストール

```
$ cd ~
$ sudo curl -sS https://getcomposer.org/installer | php　# コンポーザーのインストール
$ sudo chown root:root composer.phar 
$ sudo mv composer.phar /usr/bin/composer # パスを通す
$ composer # インストールされたか確認
```

php-mbstringとphp-xmlをインストール

```
$ sudo yum install php-mbstring php-xml -y
```

#### Git

Gitのインストール

```
$ sudo yum install git # インストール
$ git --version　# インストールされたかバージョン確認
```

#### GitHubのリポジトリからclone

ディレクトリ作成

```
$ sudo mkdir /var/www
$ cd /var/www
```

clone
*今回はHTTPS方式でクローンしましたが、もちろんSSH方式でも可能です。

```/var/www
$ sudo git clone https://github.com/[ユーザー名]/[リポトリ名].git
```

Nginxの設定情報の変更

```
$ sudo vi /etc/nginx/nginx.conf
```

```/etc/nginx/nginx.conf
# 略
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/リポジトリ名/public; # ここを修正

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            try_files $uri $uri/ /index.php$is_args$args; # ここを修正
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}
# 略
```

Nginxを再起動

```
$ sudo systemctl restart nginx
```


各種インストール、設定

```
$ cd /var/www/リポジトリ名
$ sudo composer install # composerのインストール
$ sudo chmod -R 777 storage/ # 権限変更
```

.envファイルの作成

```
$ sudo touch .env 
``` 

.envの情報を適宜変更してください。DBの設定はRDSの設定後に行います。

```/var/www/リポジトリ名/.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
```

これでIPv4パブリックIPをブラウザに入力すればLaravelの画面が表示されると思います。

■参考記事
[Laravelのプロジェクトをgit cloneしたときの手順](http://vdeep.net/laravel-git-clone)

## RDS

設定情報の値は適宜情報を入力し、作成を行ってください。

参考までに私は下記の画像の値を入力しました。

![スクリーンショット 2020-09-13 12.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/d4e12fa9-6534-1306-ae30-115a4adc1b38.png)

![スクリーンショット 2020-09-13 12.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/97284bcf-45a5-2ad6-0250-65dfa41f4329.png)

![スクリーンショット 2020-09-13 12.02.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/2af92e37-43f4-1dde-589c-1fe36c3352ad.png)

![スクリーンショット 2020-09-13 12.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/954b91df-f7b7-e6aa-1831-f52973a783f2.png)

![スクリーンショット 2020-09-13 12.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/7a18b222-76ac-ab22-02e2-fcf08445721c.png)

Virtual Private Cloud (VPC)、サブネットグループ、既存のVPCセキュリティグループはEC2の設定に合わせました。
最初のデータベース名の値は.envファイルを設定する際に使用します。

### セキリティグループ

今回のRDSのセキリティグループの設定はEC2と同一のものにしました。

セキリティグループのインバウンドルールの設定は、「HTTP」「SSH」を既存で追加していますので、ここで新たに「MYSQL/Auora」を追加しましょう。

![スクリーンショット 2020-09-13 12.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/81cec169-7771-3d10-eb3c-5a8688a7a320.png)


### .envの設定、マイグーレション 

.envの設定に先ほどのRDSの設定した値を入力します。

```/var/www/リポジトリ名
$ sudo vi .env
```

```/var/www/リポジトリ名/.env
DB_CONNECTION=mysql
DB_HOST=エンドポイント
DB_PORT=3306
DB_DATABASE=最初のデータベース名
DB_USERNAME=マスターユーザー名
DB_PASSWORD=マスターパスワード
```

私は誤ってDB_DATABASEの値をDBクラスター識別子で設定してかなりハマりました。

最後にマイグレーションを実行

```/var/www/リポジトリ名
$ sudo php artisan migrate
```

これでIPv4パブリックIPをブラウザに入力するとデータベースが繋がった状態でLaravelの画面が表示されます。

## 参考

[ゼロからわかるAmazon Web Services超入門 はじめてのクラウド](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8BAmazon-Web-Services%E8%B6%85%E5%85%A5%E9%96%80-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93IT%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7/dp/4297106612)