【AWS】LaravelアプリをEC2へデプロイ

<br>
こんにちは、Reikaです。<br>私は現在、アプレンティスの5期生として日々勉強に励んでいます。<br>

https://apprentice.jp/lp

<br>
<br>
最近、Laravelで作成したオリジナルプロダクトのインフラを構築しました。<br>
今回はこの経験を通じて学んだことについて、記述していきます！<br>

# 目次
1. 今回のゴール
2. 事前準備
3. 方法
    3-1. yumのアップデート
    3-2. Apacheのインストール
    3-3. PHPのインストール
    3-4. Gitのインストール
    3-5. MySQLのインストール
    3-6. .envファイルの編集


# 1. 今回のゴール
EC2上でLaravelとMySQLを動かし、作成したドメインにアクセスしたらページが開かれること。

# 2. 事前準備
- AWSアカウント作成済み(IAMユーザーでログイン)
- リージョンはアジアパシフィック(東京)ap-northeast-1
- 事前に下記のものを作成済み
    * VPC
    * パブリックサブネット/プライベートサブネット
    * EC2インスタンス
    * RDSインスタンス
    * DBサブネットグループ
    * ルートテーブル
    * インターネットゲートウェイ
    * セキュリティグループ(パブリックサブネット/プライベートサブネット)
    * ElasticIP
    * ドメインの購入、Route53でDNSの設定

こちらの事前準備は、以下の山浦さんのUdemy講座を参考にしながら行いました↓<br>AWS初心者さんにはすっごくおすすめです！

https://www.udemy.com/course/aws-and-infra/?couponCode=ST4MT73124

# 3. 方法
## 3-1. yumのアップデート

```ec2-user
sudo yum update -y
```
yumは、Amazon LinuxなどのLinuxディストリビューションでパッケージを管理するためのツール。<br> **update**  は、インストールされているパッケージの更新を確認し、必要に応じてアップデートします。<br>  **-y** は、確認を求められた際に自動的に「はい」と答えるオプションです。

## 3-2. Apacheのインストール

```ec2-user
sudo yum install -y httpd
```

Apache サーバーの起動。
```ec2-user
sudo systemctl start httpd
```

サーバーが起動されたら Apache も自動起動するように設定します。
```ec2-user
sudo systemctl enable httpd
```

## 3-3. PHPのインストール
EC2にPHPをインストールします。
```ec2-user
sudo amazon-linux-extras install -y php8.2
```

パッケージもインストール
 **php-mysqlnd:** MySQLデータベースとPHPの連携を提供します。
 **php-xml:**  XMLデータの処理を可能にします。
 **php-mbstring:** マルチバイト文字列の処理をサポートします
```ec2-user
sudo yum install php-mysqlnd php-xml php-mbstring -y
```

composerのインストール
```
curl -sS https://getcomposer.org/installer | php
```

PHP-FPM の起動
```ec2-user
sudo systemctl start php-fpm
```

## 3-4. Gitのインストール

```ec2-user
sudo yum install git -y
git --version
```
権限の変更。
```
sudo chmod 777 /var/www/html
```

リポジトリのクローン
```
cd /var/www/html
sudo git clone https://github.com/your-username/your-laravel-project.git
```

権限を変更。
```
sudo chmod 777 storage -R
sudo chmod 777 bootstrap/cache -R
```


## 3-5. MySQLのインストール

一度EC2インスタンスから出て、。
もしMariaDBがインストールされていたら（私はされていたので）アンインストール。
```ec2-user
sudo yum remove -y mariadb mariadb-server
```

MySQLのインストール
```ec2-user
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
```

DBサーバーに接続
```mysql
mysql -h <RDSのエンドポイント> -u <ユーザー名> -p
```

データベースの作成とユーザー権限の付与
```mysql
CREATE DATABASE <データベース名> DEFAULT CHARACTER SET utf8 COLLATE utf8_general_cil;
SHOW DATABASES;
CREATE USER '<ユーザー名>'@'%' IDENTIFIED BY 'パスワード';
GRANT ALL ON <データベース名>.* TO 'ユーザー名'@'%';
FLUSH PRIVILEGES;
SELECT user , host FROM mysql.user;
```

## 3-6. EC2側の.envファイルの編集

```
vi .env
```
以下の箇所を編集する。(事前に設定している箇所も含む)

```
APP_NAME=プロジェクト名
APP_URL=ドメイン名
DB_CONNECTION=mysql
DB_PORT=3306
DB_HOST=RDB インスタンスのエンドポイント
DB_DATABASE=作成した MySQL データベース名
DB_USERNAME=作成した MySQL ユーザー名
DB_PASSWORD=作成した MySQL ユーザーのパスワード
```

## 3-7. Apacheドキュメントルート変更

```
sudo vim /etc/httpd/conf/httpd.conf
```

* DocumentRootをコメントアウトして、/var/www/html/publicに変更

* < Directory "/var/www/html" > 以下の、AllowOverride Noneをコメントアウトして、AllowOverride Allに変更

## 3-9. 最終確認

マイグレーションの実行
```
php artisan migrate
```

ドメインでアクセスし、ページが開かれる！


## 4. 最後に
ロードバランサーの作成やSSL化などの設定も無事に完了し、作成したドメインにアクセスしてページが正常に表示されました。
作業中には、いくつかエラーが発生しましたが、原因は主に.envファイルの設定ミス、Apacheの起動忘れ、権限設定の不足などでした。これらのポイントを1つでも見落とすとページにアクセスできなくなるため、細かい確認が以下に必要かを学びました！