AWSでLAMP環境を構築して、Laravelアプリをデプロイする

今回はAWSのEC2、RDSを用いてLAMP環境を構築して、Laravelアプリをデプロイする手順を紹介します。

##今回の流れ
1.RDSを用いてDBサーバー作成
2.EC2を用いてWEBサーバーを作成
3.サーバー間の連携
4.アプリのデプロイ 
##前提条件
・Macを使用
・AWSアカウントを作成済みであること
・GitHubのリモートリポジトリに、開発済みのLaravelアプリが置いてあること

##1.RDSを用いてDBサーバー作成
コンソールにサインインした後、AmazonRDSに移動します。
<img width="1350" alt="スクリーンショット 2020-08-07 9.22.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/0eba2ef6-5675-641a-7227-d5a99d47b0e7.png">
続いてオレンジ色のCreate databaseボタンをクリックします。
<img width="1425" alt="スクリーンショット 2020-08-07 9.24.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/0a7813fa-e0fd-83ff-a4f2-c6be1896f8a4.png">
使用するデータベースエンジンを選びます。今回はMySQLを選択します。
バージョンはよしなに選択してください。
<img width="1425" alt="スクリーンショット 2020-08-07 9.28.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/17456c77-16a4-bdcf-ce8c-e34bc0d63048.png">
今回は無料利用枠のものを作成します。
本番環境の場合は適したプランを選択してください。
<img width="1425" alt="スクリーンショット 2020-08-07 9.33.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/754a6f5d-d74d-96b2-f761-0f346e5e56d7.png">
インスタンス名、マスターユーザー名、パスワードを設定します。
後ほど使いますので、安全な場所にメモしておきましょう。
<img width="1425" alt="スクリーンショット 2020-08-07 9.35.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/4c7cfb4b-b259-d5bd-9324-f2125ce0f3c2.png">
インスタンスのスペック、ストレージの容量等を設定します。
今回はデフォルト設定で進めますが、本番環境の場合はよしなに選択してください。
<img width="1425" alt="スクリーンショット 2020-08-07 9.37.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/54cadb94-a110-bf6b-8e3d-53ade55eb3d1.png">
ネットワークの設定を行います。
VPCを作成済みの方は作成したVPCを、そうでない方はデフォルトのVPCを設定しましょう。
<img width="1425" alt="スクリーンショット 2020-08-07 9.43.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/9bc9c7cc-831f-cbd6-0183-cf5e38457a16.png">
最後にオプションの設定をします。
RDSインスタンス初期化時に自動で作られるデータベースの名前を設定します。
今後データベースに接続する際は、ここで設定したデータベース名を使用します。<img width="1425" alt="スクリーンショット 2020-08-07 9.51.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/cb8e6370-fd9c-8556-5da5-c4ee6e5dd6dd.png">
<img width="1425" alt="スクリーンショット 2020-08-07 9.51.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/ba7b5542-77b3-d9f9-736e-7469855d95fc.png">
オレンジ色のCreate databaseボタンをクリックして設定したデータベースを作成します。
<img width="1425" alt="スクリーンショット 2020-08-07 12.28.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/39ad0a89-ed5e-033c-2f20-954fc49ca24a.png">

##2.EC2を用いてWEBサーバーを作成
コンソールからAmazon EC2に移動して、青色のLaunch Instanceボタンをクリックします。
<img width="1107" alt="スクリーンショット 2020-08-07 12.36.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/f65efba8-f008-d68b-eff9-5f1bb0ce7efd.png">
使用するマシンのイメージを選択します。
今回はAmazon Linux 2 AMIを用います。<img width="1394" alt="スクリーンショット 2020-08-07 12.39.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/fe6720b9-8c5e-d2b1-64c3-43bcb0eb0d13.png">
EC２インスタンスタイプを設定します。
CPU、メモリ、ストレージ、ネットワークパフォーマンス等を考慮してよしなに選択します。
今回はt2.microを選択します。（無料利用枠の対象です）<img width="1431" alt="スクリーンショット 2020-08-07 13.45.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/a9a44a76-9448-240a-f2da-3d6832056fca.png">

<img width="1394" alt="スクリーンショット 2020-08-07 12.48.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/eb03f40d-f1b3-0db5-3a5d-027d7c898008.png">
詳細の設定です。
VPCやサブネット等を設定できますが、今回はとりあえずVPCのみ設定しておきます。
RDSで設定したものと同じVPCを選択してください。
<img width="1394" alt="スクリーンショット 2020-08-07 12.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/0a11834f-0df7-4eeb-5957-64245ee17c2e.png">
ストレージの設定をします。
他にインスタンスを作成されない場合は３０GBまでは無料枠です。
今回はデフォルトの８GBで進めていきます。
<img width="1431" alt="スクリーンショット 2020-08-07 12.56.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/2163cb27-9508-0c26-22ff-1d4e4ec92fbd.png">
続いてタグの設定ですが今回は未設定のまま進み、セキュリティグループの設定をします。
EC２インスタンスへのアクセス許可、制限を指定します。
まずはSSH接続の設定です。
Create a new security groupを選択し、新しいグループを作成します。
TypeのプルダウンからSSHを選択し、SourceのプルダウンからはMyIPを選択しましょう。
次にHTTP接続です。
Add Ruleをクリックした後、TypeのプルダウンからHTTPを選択し、SourceのプルダウンからはMyIPを選択しましょう。
今回は自分のIPからのみ接続できる設定にします。
本番環境で不特定多数のアクセスを集める場合はHTTPのSourceをAnywhereにしてください。
<img width="1431" alt="スクリーンショット 2020-08-07 13.45.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/91236e27-a1cb-a84f-033f-7a1617e47dbb.png">
Review and Launchをクリックし確認画面に遷移し、設定内容に問題がなければLaunchをクリックしましょう。
最後に、SSH接続するためのキーペアを作成します。
Create new key pairを選択し、キーペアの名前を設定します。
設定後、Download Key Pairをクリックして.pemファイルをダウンロードします。
このファイルがなければSSH接続できないので、安全な場所で保管してください。
青色のボタンLaunch Instanceをクリックしてインスタンスを起動します。
<img width="1431" alt="スクリーンショット 2020-08-07 13.59.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/3186bd94-4279-9e42-c786-c2bcb1b3cc01.png">
##3.サーバー間の連携
まずは先に作成したRDSの設定を変更し、EC２インスタンスからRDSインスタンスへのアクセスを可能にします。
AmazonRDSに移動します。
<img width="1350" alt="スクリーンショット 2020-08-07 9.22.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/0eba2ef6-5675-641a-7227-d5a99d47b0e7.png">
左側のダッシュボードのDatabasesをクリックして、先に作成したデータベースを選択します。
Connectivity & securityタブのセキュリティグループをクリックします。
<img width="1431" alt="スクリーンショット 2020-08-07 14.11.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/be716e41-44e4-64a7-3a29-2a09a858b748.png">
デフォルトではEC2インスタンスからRDSインスタンスへのアクセスは許可されていません。
Inboundタブを開きeditをクリックしてセキュリティグループの編集を行います。
<img width="1431" alt="スクリーンショット 2020-08-07 14.22.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/e6e17c80-77fd-396c-2a6d-fdd5672db514.png">
TypeをMySQL/Auroraに、SourceをCustomeに設定し先ほど作成したEC2のセキュリティグループの名前を入力します。
利用可能なセキュリティグループが表示されるので、先ほど作成したものを選択します。自動で値が入力されます。
青色のSavaボタンをクリックし設定を反映させます。
<img width="1431" alt="スクリーンショット 2020-08-07 14.58.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/81bd97a9-f31d-ea11-cbc7-a48b51f99cfd.png">
続いてEC2インスタンスにSSH接続していきます。
ターミナル上のキーペアがあるディレクトリで以下のコマンドを実行します。

```
ssh -i .pemファイル名 ec2-user@パブリックIP
```
パブリックIPは、接続するインスタンスのこちらをコピーペーストしましょう。
<img width="1431" alt="スクリーンショット 2020-08-07 15.15.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/46094d37-26d2-9a65-b6b8-03d077411fe9.png">
EC2インスタンスにSSH接続できたら、RDSに接続するための準備をしていきます。
MySQLをインストールしたいのですが、MariaDBがデフォルトでインストールされていると競合してしまうので、アンインストールしておきます。

```
$ sudo yum remove mariadb-libs
```
MySQLのリポジトリを追加して、MySQLをインストールします。

```
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
$ sudo yum install mysql
```
MySQLのホスト名を環境変数に設定して、データベースに接続します。
エンドポイントはRDSインスタンスのホスト名を入力します。
ユーザー名、パスワード、DB名は先に作成したものです。

```
$ export MYSQL_HOST=エンドポイント
$ mysql --user=ユーザー名 --password=パスワード DB名
```
<img width="1431" alt="スクリーンショット 2020-08-07 17.11.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/f5cf27d4-6bc8-e3c1-752f-1ba4849d7b1c.png">
Laravelアプリのためのユーザーを作成し、データベースへのアクセス権限を付与します。

```
mysql> CREATE USER 'ユーザー名' IDENTIFIED BY 'パスワード';
mysql> GRANT ALL PRIVILEGES ON DB名.* TO ユーザー名;
mysql> FLUSH PRIVILEGES;
mysql> Exit
```
次にEC2インスタンスにApacheとPHPをインストールします。
まずはApacheのインストールです。

```
$ sudo yum install -y httpd
$ sudo service httpd start
```
パブリックIPアドレスにアクセスして、以下の画面が表示されていればインストール成功です。
<img width="1431" alt="スクリーンショット 2020-08-07 17.47.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/0e95151c-6b71-e49e-208a-baa2470a8986.png">
PHP並びにLaravelアプリに必要な拡張モジュール等をインストールしていきます。
今回のLaravelのバージョンは5.5なので、対応したPHP拡張モジュールも合わせてインストールしておきます。
また、自分の開発したアプリに必要な拡張モジュールがあれば適宜追加でインストールしてください。

```
$ sudo amazon-linux-extras install -y php7.2
$ sudo yum -y install php-openssl php-pdo php-mbstring php-tokenizer php-xml
```
これでLAMP環境を構築することができました。
##4.アプリのデプロイ
Laravelアプリのデプロイ、デプロイのための最終準備をしていきます。
まずはEC2インスタンスにGitをインストールします。

```
$ sudo yum -y install git
```
続いて/var/www/htmlに移動して、完成済みのLaravelアプリをgit cloneします。

```
$ cd /var/www/html
$ sudo git clone URL
```
Apacheの設定を変更していきます。
/etc/httpd/confに移動して、httpd.confを編集します。

```
$ cd /etc/httpd/conf
$ vi httpd.conf
```
以下が編集箇所です。
119行目付近でドキュメントルートを変更し、アクセスがあった際にアプリ直下のpublicディレクトリにファイルを探しにいってくれるようにします。
131行目付近、151行目付近でpublicディレクトリ内での設定の変更を有効にします。
最終行でmod_rewriteを許可することでURLの書き換えを可能にします。

```
#119行目付近　
DocumentRoot "/var/www/html/Laravelアプリ/public"
#131行目付近
<Directory "/var/www/html/Laravelアプリ/public">
#151行目付近
AllowOverride All
#最終行に追加
LoadModule rewrite_module modules/mod_rewrite.so
```
変更後はApacheを再起動させます。

```
$ sudo systemctl restart httpd
```
続いてComposerをインストールします。
/usr/local/bin/にインストールしてファイル名を変更することで、どこからでもcomposerコマンド一つで呼び出し可能にします。

```
$ cd /usr/local/bin/
$ sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ sudo php -r "if (hash_file('sha384', 'composer-setup.php') === 'e5325b19b381bfd88ce90a5ddb7823406b2a38cff6bb704b0acc289a09c8128d4a8ce2bbafcd1fcbdc38666422fe2806') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified
$ sudo php composer-setup.php
$ sudo php -r "unlink('composer-setup.php');"
$ sudo mv composer.phar composer
```
最後の仕上げです。
アプリの環境変数の設定等を行っていきます。
まずはcomposer.lockファイルを基にパッケージをインストールします。
ディレクトリの権限も変更しておきます。こちらの変更はアプリ起動完了後によしなに変更しても良いかと思います。

```
$ cd /var/www/html
$ chmod 777 Laravelアプリ
$ cd Laravelアプリ
$ chmod 777 bootstrap/cache
$ chmod 777 storage/framework/sessions
$ chmod 777 storage/framework/views
$ chmod 777 storage/logs vendor
$ composer install
```
.env.exampleファイルを基に.envファイルを作成します。

```
$ cp .env.example .env
$ vi .env
```
先に作成したRDCインスタンスを基に、DB接続に関する変数を定義していきます。
ユーザー名、パスワードはRDCインスタンスに接続して登録したものを設定します。

```
DB_CONNECTION=mysql
DB_HOST=ホスト名（エンドポイント）
DB_PORT=3306
DB_DATABASE=DB名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```
artisanコマンドを叩いてアプリケーションキーを作成します。
マイグレーションも実行しておきます。（開発済みのアプリなのでマイグレーションファイルがあることが前提です）

```
php artisan key:generate
php artisan migrate
```
これでパブリックIPアドレスにアクセスすれば、アプリケーションが動作しているはずです！
ここまでお疲れ様でした。