[AWS EC2]開発したLaravelアプリケーションを動かすための準備 ~備忘録~

## はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、EC2にGitをインストールしてGitHubにpush済みのアプリケーション(**Laravelで開発**)をインストールする手順と、アプリケーションを動かすための準備(.envファイルの作成)について学びましたので、すぐに復習できるよう記事にまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

## アプリケーションをインストールするための下準備

### ・Gitのインストール
ローカル開発したアプリケーションのインストールは``git clone``コマンドを使うので、EC2に``Git``をインストールします。

**ec2-user**ユーザーの状態で下記のコマンドを実行します。

```
$ sudo yum install git -y

//実行結果
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
依存性の解決をしています
# 略
完了しました!
```
上記のように、**完了しました**と表示されればGitのインストールは成功しています。

``~gitのバージョン確認~``
下記のように、``git version``で確認できます。

```
$ git version
git version 2.32.0
```

### ・権限管理用のユーザーへ切り替える
ローカル開発したアプリケーションは、権限管理用のユーザーでインストールします。

下記のコマンドを実行してユーザーを切り替えます。

```
$ sudo su - username

//実行結果 usernameと表示されていると切り替えは成功です
[username@ip-172-16-10-10 ~]$
```
``コマンドの説明``
**・su** : ユーザーを切り替えるコマンド

**・-** : 切り替える対象となるユーザーのホームディレクトリに移動する

## GitHubにpush済みのアプリケーションをインストールする
先ほど切り替えたユーザーの``/home/username``ディレクトリ以下で下記のコマンドを実行します。

```
$ git clone https://github.com/(GitHubアカウント名)/リポジトリ名.git

//実行結果
Cloning into 'リポジトリ名'...
remote: Enumerating objects: 3707, done.
remote: Counting objects: 100% (1161/1161), done.
remote: Compressing objects: 100% (825/825), done.
remote: Total 3707 (delta 637), reused 586 (delta 331), pack-reused 2546
Receiving objects: 100% (3707/3707), 1.13 MiB | 10.95 MiB/s, done.
Resolving deltas: 100% (2390/2390), done.
```
``~git cloneの補足~``

・ディレクトリ名を設定できる
``git clone ~ リポジトリ名.git``の後に、**半角スペース+ディレクトリ名**を指定することで、``$ ls -l``でディレクトリ一覧を確認する際に、指定したディレクトリ名が表示されるようになります。

・ディレクトリの削除
git cloneしたリポジトリを削除する場合、``$ rm -r ディレクトリ名``で削除できます。
削除する際に、下記のように本当に削除するか問われるので``y(yes) or n(no)``を入力して下さい。

```
rm: remove write-protected regular file ‘ディレクトリ名/.git/objects/pack/pack-########.pack’? y
rm: remove write-protected regular file ‘ディレクトリ名/.git/objects/pack/pack-########.idx’? y
```

``git clone``を実行後、下記のコマンドを実行します。

```
$ ls -l

//実行結果
drwxrwxr-x 6 username username 131 Sep 14 09:18 リポジトリ名
```
上記のように、所有者とオーナーがusernameであるリポジトリ名のディレクトリが作成されていれば``git clone``は成功です。


## .envファイル関連のセットアップ
### 1. .envファイルの作成
GitHubからコピー(git clone)したアプリケーションには、Laravelの環境変数ファイルである``.envファイル``が含まれていません。
代わりにComposerをインストールした際に作成される``.env.example``が存在するので、これをコピーして``.envファイル``を作成します。

別記事で追加した[権限管理用ユーザー](https://qiita.com/susuz/items/03af2e488e687778c028)の、``/home/username/xxxxディレクトリ``で下記のコマンドを実行してください。
※ユーザーによってディレクトリの階層構造が異なると思うので``.env.exampleファイル``が存在するディレクトリに移動して下さい。

```
$ sudo su -　username #追加したユーザーのhomeディレクトリに移動する
$ cp .env.example .env #移動後、.env.exampleをコピーして.envを作成
```
実行が成功しているかを確認するため下記のコマンドを実行してください。

```
$ ls -la .env

//実行結果
-rw-rw-r-- 1 username username 1160 Apr 29 15:43 .env
```
上記のように``.envファイル``が存在すれば問題ありません。

### 補足:ディレクトリの階層構造が何段かに分かれている場合

一連の流れを、下記にてまとめておきますので参考にして下さい。

```
#1.ec2-userから特定のユーザーのホームディレクトリに移動する
[ec2-user@ip-###-##-##-## ~]$ sudo su - username

#2.git cloneでコピーしたディレクトリの存在を確認
[username@ip-###-##-##-## ~]$ ls -l
total 0
drwxrwxr-x 6 username username 131 Feb 22 09:00 Example

#3.対象となるディレクトリに移動する
[username@ip-###-##-##-## ~]$ cd Example

#4.階層構造になっている場合は、.env.exampleファイルが存在するディレクトリに移動する
[username@ip-###-##-##-## ~]$ cd example

#5.移動後、.env.exampleをコピーして.envファイルを作成する
[username@ip-###-##-##-## example]$ cp .env.example .env
```

### 2. .envファイルにAPP_KEYを設定する
コピーした.envの状態では、Laravelで暗号化処理などに使用される環境変数APP_KEYがまだ設定されていません。
従って、ec2-user以外のユーザー(username)の状態で、``vendorファイル``が存在する``/home/username/特定のディレクトリ``で下記のように``php artisan key:generate``コマンドを実行して設定します。

```
[username@ip-###-##-##-## 特定のディレクトリ]$ php artisan key:generate
Application key set successfully.
```

``~注意~``
※ただし、**git cloneしたプロジェクトにはvendorディレクトリがないので上記のコマンドを実行するとエラーが起きます**。
ですので、.envファイルを作成する前後で``composer install --no-dev --prefer-dist``コマンドを実行してPHP関連パッケージのインストールを行って下さい。


### 3. .envファイルの編集
ローカル開発したアプリケーションの.envファイルでは、本番環境に適していない箇所が複数あるので本番環境用に編集します。

追加した権限管理用ユーザー(username)の状態で、``/home/username/xxxxディレクトリ``で下記のコマンドを実行して``vi``を起動させます。

``vi``が起動したら、下記の通りに.envファイルを編集します。

```
$ vi .env #viを起動させて.envファイルを開く

APP_NAME=Laravel
APP_ENV=production #この行を変更(localをproductionに変更)
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
APP_DEBUG=false #この行を変更(trueをfalseに変更)
APP_URL=http://xxx.xxx.xxx.xxx #この行を変更(localhostをEC2のパブリックIPアドレスに変更)
# 略
```
``~編集内容の解説~``
・AWS環境を本番環境としているため、``APP_ENV``は``production``に変更しています。

・Lravelのエラー発生時に詳細を表示させないようにするために、``APP_DEBUG``を``false``に変更しています。

・``APP_URL``はEC2インスタンスのパブリックIPアドレス(ElasticIPアドレス)に変更しています。

※データベース関連の変更も行う必要がありますが、変更点については[リンク先]()にてまとめておりますのでご覧ください。

## 補足
### ・viの操作方法
基本的な編集に関する操作方法は下記の通りになります。

1.特定のディレクトリで、viを起動
2.キーボードの``i``を押してインサートモードにする
3.カーソルキーで編集したい位置までカーソルを移動して編集を行う
4.``escキー``を押して、インサートモードを終了する
5.``:wq``と入力してエンターキーを押すことで、ファイルを保存してviを終了する

``~注意点~``
ファイルを誤った内容に編集してしまった場合、以下の操作を行なってください。

1.escキーを押して、インサートモードを終了する
2.``:q!``と入力してエンターキーを押すことで、ファイルを保存せずにviを終了する

上記の手順を踏むことで、再度viを起動して編集を行うことができます。

### ・viが強制終了されスワップファイルが作成された場合の対処法
強制終了した場合、自動的にスワップファイル(.swp)が作成されます。

**・スワップファイルとは**
vimがクラッシュしてしまうときに備えて作成されているファイルです。
vimでの編集作業前に作られ、編集作業後に自動的に削除されます。
このファイルがあることで、vimが強制終了してしまってもデータを復元できます。

スワップファイルがある場合、下記のようなものが表示されます。

```
E325: ATTENTION
Found a swap file by the name ".swp_sample.txt.swp"
          owned by: hoge   dated: Mon Jan 23 12:09:39 2021
         file name: ~hoge/swp/swp_sample.txt
          modified: no
         user name: hoge   host name: O-04850-MAC.local
        process ID: 8563
While opening file "swp_sample.txt"
             dated: Mon Jan 23 12:07:24 2021

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r swp_sample.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".swp_sample.txt.swp"
    to avoid this message.

Swap file ".swp_sample.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover,(Q)uit, (A)bort: 
```
表示されているそれぞのキーを選択することで、次の動作を決める事ができます。

キーを選択後、作成されたスワップファイルを削除したい場合、下記のコマンドを入力してください。

```
$ find . -name ".swp_sample.txt.swp"|xargs rm
```


## 参考文献
[AWS でデプロイの自動化を実現するベストプラクティスをグラレコで解説](https://aws.amazon.com/jp/builders-flash/202005/awsgeek-ci-cd/?awsf.filter-name=*all)
[CodeDeploy と GitHub の統合](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/integrations-partners-github.html)
[チュートリアル: CodeDeploy を使用して GitHub からアプリケーションをデプロイする](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorials-github.html)
[PHP 開発環境のセットアップ](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-development-environment.html#php-development-environment-libraries)