LaravelをAWSのEC2へデプロイする手順

##前提
+ 2020年1月4日に確認したものです。
+ AWSのアカウント作成済
+ プロジェクトをGitHubにpush済

##環境
+ macOS Catalina 10.15.2
+ Apache 2.4
+ PHP 7.1.33
+ MySQL 5.7
+ Laravel 5.8

#1. EC2インスタンスの起動
+ EC2コンソールで作成（「[公式チュートリアル](https://aws.amazon.com/jp/getting-started/tutorials/launch-a-virtual-machine/)」が分かりやすかったです）
+ 基本的に無料利用枠(下記の項目以外はデフォルト値)

| 設定項目 | 設定した内容 |
|:-:|:-:|
|Amazon マシンイメージ (AMI)   |Amazon Linux 2でなく、Amazon Linux|
|インスタンスタイプ   | t2.micro  |

+ **Linux2だと、手順が異なる**（[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)）

+ インスタンス作成の最後に、SSH接続に必要なキーペアを生成or設定
+ キーペア(pemファイル)は、~/.sshフォルダに入れておくと良い

#2. EC2内で作業
###2-1. SSHでEC２に接続

> SSHとは. SSH(Secure Shell)とは、安全に通信を行って、ネットワークに接続された機器を遠隔操作するための通信手段（プロトコル）の1つ

※ 参照:[初心者がSSHについて学ぶ(´･ω･`)](https://qiita.com/Pana/items/70cc74cd20c8b5b4fe15)

```
$ ssh -i [キーペア(pemファイル)を置いた場所のパス] ec2-user@[パブリックDNS or パブリックIP]
```
+ `iオプション`で、上記で生成or設定したpemファイルを指定する
+ `ec2-user`は、デフォルトのユーザー名。最初はこのユーザー名を使う
+ `パブリックDNS or パブリックIP`は、EC2コンソール画面で確認できる
+ 初回接続時のみ、yes/noを聞かれる

###2-2. Apache, PHP, MySQLのインストール
+ yumのアップデートは忘れずに！(パッケージを最新にする)
+ yumは`yオプション`を付けることで、問い合わせ全てにYesと答えるため、yes/noがいちいち聞かれなくなります。

```
$ sudo yum update -y
$ sudo yum install -y httpd24 php71 php71-mbstring php71-zip php71-fpm php71-mysqlnd mysql57-server
```

※ [Laravel 5.8のサーバ要件](https://readouble.com/laravel/5.8/ja/installation.html)

###2-3. Apacheを起動

```
$ sudo service httpd start
```

※ Linux2だと、systemctlコマンドが使える

この時点で、ブラウザで`パブリック IP`にアクセスすると、Apacheの画面が表示される。
（**EC2コンソール画面のセキュリティグループのインバウンドで、httpの80ポートを空けておくことを忘れずに**）
<img width="1051" alt="スクリーンショット 2020-01-04 18.42.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415008/97ec61f5-4355-2c2c-48a2-30507ec01281.png">


```
# システムが再起動するたびにApacheが起動するように設定
$ sudo chkconfig httpd on

#　設定の確認
$ chkconfig --list httpd
```

###2-4. ec2-userのファイル操作の許可を設定
参照：[公式チュートリアル](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)
> Amazon Linux Apache ドキュメントルートは /var/www/html であり、デフォルトでは root によって所有されます。

そのため、ec2-userにファイル操作の権限を設定する必要がある。

```
# ec2-userをapacheグループに追加
$ sudo usermod -a -G apache ec2-user

# いったんログアウトして、再度ログイン
$ exit
$ ssh -i [キーペアのpemファイルを置いた場所のパス] ec2-user@[パブリックDNS or パブリックIP]

# /var/www とそのコンテンツのグループ所有権を apache グループに変更
$ sudo chown -R ec2-user:apache /var/www

# グループに、/var/wwwの書き込み許可追加
$ sudo chmod 2775 /var/www

# /var/www とサブディレクトのディレクトリ許可を変更
$ find /var/www -type d -exec sudo chmod 2775 {} \;

# /var/www とサブディレクトリのファイル許可を変更
$ find /var/www -type f -exec sudo chmod 0664 {} \;
```

###2-5. composer自身のインストール

```
& curl -sS https://getcomposer.org/installer | php

# composerコマンドのパスを通す
$ sudo mv composer.phar /usr/local/bin/composer

# パス確認（/usr/local/bin/composerと表示されればOK）
$ which composer
```

###2-6. Laravelプロジェクトをgit clone

```
sudo yum install git
cd /var/www
git clone [URL]
```

###2-7. Apacheの設定変更

####http.confファイルのDocumentRootの変更
Laravelでは、プロジェクト内のpublicディレクトリをドキュメントルートに指定する必要がある

```
$ sudo vi /etc/httpd/conf/httpd.conf
```
`DocumentRoot "/var/www/html"`の箇所を`DocumentRoot "/var/www/プロジェクト名/public"`に変更

####http.confファイルに以下のDirectoryを追加（.htaccessの有効化）
```
<Directory /var/www/プロジェクト名/public>
 AllowOverride All
</Directory>
```
####Apacheの設定変更後は、再起動を忘れずに！
```
$ sudo service httpd restart
```

###2-8. パッケージのインストール

```
$ cd /var/www/[プロジェクトのフォルダ名]

# composer.jsonファイルがない場合
$ composer init

# vendorディレクトリが生成される
$ composer install
```

###2-9. Laravelプロジェクトの設定

####ディレクトリのパーミッション変更
Laravelでは、`storage`下と`bootstrap/cache`ディレクトリをWebサーバから書き込み可能にする必要がある

```
$ sudo chmod -R 777 /var/www/[プロジェクト名]/storage
$ sudo chmod -R 775 /var/www/[プロジェクト名]/bootstrap/cache
```

####.envファイルの作成

```
cp .env.example .env

# .envファイルにある「APP_KEY」(アプリケーションキー)の生成
php artisan key:generate
```
```
APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:xxxxxxx（php artisan key:generateで生成される）
APP_DEBUG=false
APP_URL=http://[パブリックIP]
```


###2-10. DBの設定、作成


####MySQL側
```
# MySQL起動
$ sudo service mysqld start

# MySQLの初期設定
$ sudo mysql_secure_installation

# システムが再起動するたびにMySQLが起動するように設定
$ sudo chkconfig mysqld on

# データベース作成
$ mysql -u root -p
> 設定したパスワード入力
> create database [データベース名];
> show databases;
```

#####`mysql_secure_installation`コマンドで聞かれること
+ パスワード検証プラグインのセットアップ
+ パスワード
+ 匿名ユーザーアカウントの削除
+ rootユーザーのリモートログインの許否
+ testデータベースの削除

####Laravel側
```
# 「DB_DATABASE」など、DB情報を設定しておく
$ sudo vi .env

DB_DATABASE=[作成したデータベース名]
DB_USERNAME=root
DB_PASSWORD=[設定したパスワード]
```
```
$ php artisan migrate
$ php artisan db:seed
```


##参考にさせて頂いた記事
[【Laravel】AWSにLaravelをインストールする](https://nori-life.com/install-laravel-aws/#htaccess)
[Laravel：EC2-PHP72-Apacheで環境を作成する](https://qiita.com/PKunito/items/31445d4475d4e18fe4d7)
[MySQL5.7 にて root のパスワード変更などの初期設定をする](https://utano.jp/entry/2017/10/mysql57-mysql-secure-installation/)