AWS EC2インスタンスにLaravelアプリケーションをデプロイしよう

前回ではNodeアプリケーションをEC2インスタンスへデプロイしましたが、今回はlaravelで作成したアプリケーションをデプロイしていきます。

# はじめに
▼環境
* Windows PC
* Vs code
* AWSアカウント
* composer version 2.6.5

## ステップ1: Laravelプロジェクトをローカル環境に作成
コマンドプロンプトで任意のディレクトリを指定し、Laravelプロジェクト作成コマンドを入力する。プロジェクト作成まで数分時間がかかることがあります。

※composerをインストールしていない人は、[こちら](https://getcomposer.org/)からダウンロードしてください

```bash
composer create-project --prefer-dist laravel/laravel プロジェクト名
```

しばらくするとプロジェクト作成が完了するので、下記と同じように表示されます。
その後、作成したプロジェクトをvs codeで開きます。

![スクリーンショット 2024-11-16 202953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/84dd18e1-845e-14e5-3570-b6b00d106a19.png)


## ステップ2: Laravelを起動させるための準備

### 1.必要なパッケージをインストール
`composer install`を実行し、`vendor`フォルダを作成

```php
composer install
```

### 2. アプリケーションキーの生成
```php
php artisan key:generate
```
### 3. 簡単なルーティングの設定
routes/web.phpを開き、以下を追加します。

```php:web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return "<h1>Hello Wolrd!</h1>";
});
```

### 3. .envファイル設定
ローカル開発環境では、.envファイルにデータベースの設定を行っていなくても動作することができますが、本番環境でLaravelアプリケーションを動作させるには、データベースの設定が必要になります。
作成したデータベースの情報を.envファイルに書き込んでください。

※ここではデータベースの作成は行いません。また次の機会で解説していこうと思います。

![スクリーンショット 2024-11-20 223542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/aaaa6db7-40b0-68dc-2085-8b8add63526b.png)




### 4. ローカルサーバーを起動
アプリケーションをテストするためにサーバーを起動
```php
php artisan serve
```

起動をし、`http://127.0.0.1:8000`にアクセスし、'Hello World!'が表示されます。

# ステップ3: 環境設定とデプロイ
ローカル環境に作成したアプリケーションをデプロイするためにEC2インスタンスを準備します。

### 1. EC2インスタンスを作成する
インスタンスの作成は[こちら](https://qiita.com/moeka-k0729/items/09eec46c6e855bfc3fe2#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)で説明をしているので、わからない人はご覧ください。
インスタンスの作成後、SSHでログインを行なってください。詳しくは[こちら](https://qiita.com/moeka-k0729/items/d2c323c90fcbd5e70515#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%89%8B%E9%A0%86)

### 2. 必要なパッケージのインストール
#### ①apacheのインストール
apacheはnginx同様、Webサーバーを構築するためのソフトウェアです。
apacheをインストール後、起動をします。
```bash
sudo dnf install httpd
```
```bash
sudo systemctl start httpd
```
apacheを起動後、作成したインスタンスのパブリックIPにアクセスします。

![スクリーンショット 2024-11-20 211821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/8178a63d-e9f5-16cd-e6af-59d808fd931c.png)


#### ②PHPとcomposerをインストールする
`composer`はLaravelアプリケーションの依存パッケージをインストールするのに使用します。
```bash
# PHPと必要なパッケージをインストール
sudo dnf install php php-cli php-json php-common php-mbstring php-zip php-xml php-curl unzip -y
```
```php
# Composerのインストーラーをダウンロード
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# インストーラーの実行
php composer-setup.php

# インストーラーの削除
php -r "unlink('composer-setup.php');"

# Composerをグローバルに移動
sudo mv composer.phar /usr/local/bin/composer
```

#### ③データベース接続用のクライアントをインストール

```bash
#PHPアプリケーションからMariaDBに接続できるようになる
# MySQLクライアントとPHPのMySQLドライバーをインストール
sudo dnf install mariadb105 php-mysqlnd -y

# PHPを再起動
sudo systemctl restart php-fpm
```

### 3. ファイル転送ソフトを準備する
今回は、FileZillaを使用してデプロイしていきます。FileZillaとはサーバー内にファイルをアップロードするためのファイル転送ソフト(FTPソフト)です。
FileZillaのダウンロードは[こちら](https://filezilla-project.org/download.php?platform=win64)から行なってください。

インストール後、FileZillaを起動させてください。
起動後、赤く囲っている箇所をクリックします。

![スクリーンショット 2024-11-20 150655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/3fa43cde-68aa-3a11-23c4-9d6a77eac4f0.png)

クリックすると、下記の画像のように表示されます

* `プロトコル：　SFTPを選択`
*  `ホスト：　作成したインスタンスのパブリックIPv4アドレス`
*  `ログオンタイプ：　鍵ファイル`
*  `鍵ファイル：　鍵ファイルのパス`

下記画像のようにすべて選択できたら、**接続ボタン**をクリックします

![スクリーンショット 2024-11-20 150743 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/7cf7dabf-84db-e3f0-6979-4fcd8648dcef.png)

接続が完了すると、下記画像のように表示されます。

![スクリーンショット 2024-11-20 210859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/73194641-c870-29eb-7547-d2785860dd3b.png)

今回は`/var/www/html/プロジェクト`にアプリケーションをアップロードしていきます。
EC2インスタンスのデフォルトの権限設定は root ユーザーになっているので権限を変更していきます。

### 4. 権限の変更
FilezillaのログインをEC2インスタンスの`ec2-userユーザー`で行っているため、そのユーザーに適切な権限を与える必要があります。

` /var/www/html`の権限を確認してみましょう。
EC2インスタンスにログインをし、コマンドを実行します。

```bash
ls -ld /var/www/html 
```

コマンドを実行すると下記のように表示されるかと思います。
```bash
drwxr-xr-x. 2 root root 6 Jul 30 14:58 /var/www/html
```
こちらは、`/var/www/html`はrootユーザーが所有していて所有者には読み書きの権限があるが、グループやその他のユーザーには読み取りと実行の権限しかないという意味になります。<br>


* `d`: ディレクトリ (directory) を表す
* `rwx`: 所有者 (root ユーザー) に対する読み取り、書き込み、実行の権限を示す
* `r-x`: グループに対する読み取りと実行の権限を示す
* `r-x`: その他のユーザーに対する読み取りと実行の権限を示す
* `root`: このディレクトリの所有者が root ユーザーであることを示す
* `root`: このディレクトリの所有グループが root グループであることを示す<br><br>


FilezillaでのログインをEC2インスタンスのec2-userユーザーでおこなっているので、ec2-userに権限を与えます。一般的なWebサーバの構成では、Webコンテンツを管理するユーザーをapacheグループに所属させることが一般的なので、apacheグループにec2-userを追加します。

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

#/varディレクトリとその下にあるすべてのファイルとディレクトリ(-R オプション)の所有者をec2-userに、所有グループをapacheに変更
sudo chown -R ec2-user:apache /var/www/html
```

もう一度`/var/www/html`の権限を確認すると、ec2-userユーザーが所有者にapacheが所有グループに変更されていることが確認できます。

```bash
ls -ld /var/www/html 
```
```bash
drwxr-xr-x. 2 ec2-user apache 6 Jul 30 14:58 /var/www/html
```



### 5. アプリケーションをデプロイする
権限をec2-userに変更できたので、FillZillaを使用してインスタンスにアプリケーションをデプロイしていきます。


`/var/www/html`ディレクトリに移動し、`laravel-practice`というフォルダを作成します。

![スクリーンショット 2024-11-20 215453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/981f5236-43f1-6734-fe3f-d0342d7c7060.png)


作成できたら、ローカル環境で作成したアプリケーションをアップロードしていきます。
**`vendor`フォルダ以外**すべてアップロードしてください。

![スクリーンショット 2024-11-20 220148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/7b67b77b-b4c4-c67d-38d9-267a02948ef2.png)

アップロードしたいフォルダを選択し右クリックをするとuploadボタンが表示されるのでそちらをクリックします。
すべてのアップロードできたら、FileZillaは閉じてしまって大丈夫です。

![スクリーンショット 2024-11-20 220331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/1cfa314f-42bc-9f8f-4084-e2e5077548c3.png)


### 5. Apacheの設定ファイルを編集する
最後に、Apacheの設定ファイルを編集します。
インスタンスにログインをし、以下コマンドを実行します。

```
sudo nano /etc/httpd/conf.d/laravel.conf
```

コマンドを事項するとテキストエディタが起動するので、下記を貼り付けます。

* `serverName`: インスタンスのIPアドレス
* `DocumentRoot`:  Laravel アプリケーションのドキュメントルートは`/public`になる

```bash
<VirtualHost *:80>
    ServerName 3.112.203.23
    DocumentRoot /var/www/html/laravel-practice/public
    
    <Directory /var/www/html/laravel-practice/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

設定ファイルを編集し、保存をしたらapacheを再起動させます。

```bash
sudo systemctl restart httpd
```

最後に、composer installを実行し、vendorフォルダを作成を行います。
```bash
[ec2-user@ip-172-31-47-86 laravel-practice]$ composer install
```

### 6.動作確認
デプロイが完了したらしっかりと動作しているか確認を行います。
パブリックIPアドレスにアクセスを行い、下記画像と同じように表示されていれば正常にlaravelアプリケーションが起動できています。

![スクリーンショット 2024-11-20 222306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/8018eed0-58f8-14e1-cdec-b52ebabd14c6.png)


# おわりに
最後までご覧いただきありがとうございました！