AWSのEC2へのデプロイ②(必要なパッケージのインストール)

AWSのEC2へのデプロイをしたいと思い備忘録のために手順を記録します。
初学者の為、ご指摘等ありましたらご連絡いただければ幸いです。

前回の記事はこちら
[AWSのEC2へのデプロイ①(EC2インスタンス作成からログインまで)](https://qiita.com/mumucochimu/items/e29ac4db293c12990f61)

前回の内容は言語関係ないのですが今回から必要なパッケージが言語によって異なるのでご注意ください。

## はじめに

私自身この手順で無事にデプロイができましたが、途中でエラーが出たことによりいろいろな記事を参考にさせて頂きました。
この場を借りて御礼申し上げます。

そのため、私に知識がないばかりに私の環境に必要のない操作もあるかもしれません。
初学者のためご承知おきください。
お気づきの点ございましたらご連絡いただければとても喜びます。

## 環境

|                | Version     |
|:---------------|------------:|
| PHP            | 7.4.14      |
| Laravel        | 8.24.0      |
| mysql          | 8.0.23      |
| docker         | 20.10.2     |
| docker-compose | 1.27.4      |

EC2では`Amazon Linux 2`を利用しています。

## 前提

- AWSのアカウントを作成済みである
- EC2のインスタンス作成済みでsshにログインできる

## EC2インスタンスに接続

1.AWSのEC2の画面で下記画像のように`インスタンス`から`接続`を押下します。

![スクリーンショット 2021-02-13 22.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/24fd0049-bb6d-2753-27a6-faeb3dbaef5b.png)

2.下記画像のように`SSHクライアント`を押下後、一番下の文字列をコピーします。

![スクリーンショット 2021-02-13 22.45.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/efee848b-ac99-86e8-fa3f-1884a8c747bb.png)

3.コピーした`ssh -i ~`をターミナルで入力すると

```PHP:ターミナル
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

と出るので`yes`と入力します。

4.下記のような内容が出力されていればOKです。

```PHP:ターミナル
[ec2-user@ip-×××-××-××-××× ~]$
```

## gitのインストール

コマンドは全てEC2インスタンス内で行います。

1.下記コマンドでyumをupdateします。

```PHP:ターミナル
$ sudo yum update -y
```

2.下記コマンドでgitをインストールします。

```PHP:ターミナル
$ sudo yum install git
```

3.下記コマンドご自身のユーザー名とパスワードを設定します。

```PHP:ターミナル
$ git config --global user.name [ユーザー名]
$ git config --global user.email [メールアドレス]
```

4.下記コマンドで確認します。

```PHP:ターミナル
$ git config --list | grep user
```

5.下記のように出ていればOKです。

```PHP:ターミナル
user.name=[ユーザー名]
user.email=[メールアドレス]
```

## Dockerのインストール

コマンドは全てEC2インスタンス内で行います。
Dockerのインストールは公式の[AmazonECSにおけるDockerの基本](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html)で確認しました。

1.下記コマンドで最新の`Docker Engineパッケージ`をインストールします(Amazon Linux 2用のコマンドです。)

```PHP:ターミナル
sudo amazon-linux-extras install docker
```

2.下記コマンドでDockerサービスを開始します。

```PHP:ターミナル
sudo service docker start
```

3.下記コマンドで`ec2-user`を`dockerグループ`に追加すると`sudoコマンド`を使用せずに`Dockerコマンド`を実行できます。

```PHP:ターミナル
sudo usermod -a -G docker ec2-user
```

4.一旦EC2インスタンスからログアウト(exit)して再ログインします。
※これをしなくて私はエラーになりましたので大事です。

5.下記コマンドで`ec2-user`が`sudoコマンド`を使用せずに`Dockerコマンド`を実行できることを確認します。

```PHP:ターミナル
docker info
```

下記のようなメッセージが出ればOKです。

```PHP:ターミナル
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
//省略
```

## docker-composeのインストール

参考記事：[M1 Mac + Laravel + Docker + AWS でポートフォリオを作るまで[初心者][未経験]](https://qiita.com/kohei-katashima/items/b67475e1e352ff134b61)

コマンドは全てEC2インスタンス内で行います。


1.下記コマンドで`su`に入ります。

```PHP:ターミナル
sudo -i
```

2.下記コマンドでcomposeをインストールします。

```PHP:ターミナル
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

3.下記コマンドで実行権限を付与します。

```PHP:ターミナル
chmod +x /usr/local/bin/docker-compose
```

4.exitをして抜けます。

```PHP:ターミナル
exit
```

5.下記コマンドでdocker-composeがインストールされているか確認します。

```PHP:ターミナル
docker-compose --version
```

下記のようにバージョンが出てくればOKです。

```PHP:ターミナル
docker-compose version 1.27.4, build 40524192
```

参考にした先ほどの記事で`docker-compose.yml`のバージョンを書き換えました。

```PHP:docker-compose.yml
version: "3.3" ←変更
services:
  app:
    build: ./infra/php
    volumes:
      - ./backend:/work
//省略
```

## EC2インスタンス内でDockerを起動

コマンドは全てEC2インスタンス内で行います。

1.下記コマンドでgitからcloneします。

```PHP:ターミナル
git clone [githubのURL]
```

2.下記コマンドでフォルダがあるか確認します。

```PHP:ターミナル
ls
```

3.下記コマンドでディレクトリを移動します。

```PHP:ターミナル
cd [ディレクトリ名]
```

4.下記コマンドでdockerコンテナを立ち上げます。
少し長いメッセージが出ます。

```PHP:ターミナル
docker-compose up -d
```

下記のようなメッセージが出ればOKです。

```PHP:ターミナル
Creating ×××_app_1 　　　　　... done
Creating ×××_web_1 　　　　　... done
Creating ×××_db_1  　　　　　... done
Creating phpmyadmin         ... done
```

5.下記コマンドでステータスを確認します。

```PHP:ターミナル
docker-compose ps
```

`State`が全て`up`になっていればOKです。


## PHPのインストール

参考記事：[AWS EC2 AmazonLinux2 PHPをインストールする](https://qiita.com/miriwo/items/7d94303e7185e4118f52)

コマンドは全てEC2インスタンス内で行います。

1.下記コマンドでインストールリポジトリを追加します。

```PHP:ターミナル
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```

```PHP:ターミナル
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

2.下記コマンドで既存のPHPパッケージを削除します。（削除するものがなくても問題ないです)

```PHP:ターミナル
sudo yum remove php
```

3.下記コマンドでPHPのパッケージをインストールします。

```PHP:ターミナル
sudo yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt
```

4.下記コマンドでバージョンを指定してインストールします。
途中で`[y/d/N]`とインストールしてもいいかの選択が出るので`y`を押しEnterで進めます。

```PHP:ターミナル
sudo amazon-linux-extras install php7.4
```

5.下記コマンドでその他の必要なパッケージをインストールします。
こちらも途中で`[y/d/N]`とインストールしてもいいかの選択が出るので`y`を押しEnterで進めます。

```PHP:ターミナル
sudo yum install --enablerepo=remi,amzn2extra-php7.4 php-xml php-mbstring
```

6.下記コマンドでyumにてインストールされたphpと名前がつくパッケージの一覧を表示し確認します。

```PHP:ターミナル
yum list installed | grep php
```

下記のように表示されればOKです。

```PHP:ターミナル
php-cli.x86_64                  7.4.7-1.amzn2                 @amzn2extra-php7.4
php-common.x86_64               7.4.7-1.amzn2                 @amzn2extra-php7.4
php-fpm.x86_64                  7.4.7-1.amzn2                 @amzn2extra-php7.4
php-json.x86_64                 7.4.7-1.amzn2                 @amzn2extra-php7.4
php-mbstring.x86_64             7.4.7-1.amzn2                 @amzn2extra-php7.4
php-mysqlnd.x86_64              7.4.7-1.amzn2                 @amzn2extra-php7.4
php-pdo.x86_64                  7.4.7-1.amzn2                 @amzn2extra-php7.4
php-xml.x86_64                  7.4.7-1.amzn2                 @amzn2extra-php7.4
```

7.無事に成功すれば下記コマンドでバージョンが表示されます。

```PHP:ターミナル
php --version
```

## MariaDBのインストール

コマンドは全てEC2インスタンス内で行います。

1.下記コマンドでMariaDBのインストールをします。

```PHP:ターミナル
sudo yum -y install mysql56-server mysql56-devel mysql56 mariadb-server mysql-devel
```

2.下記コマンドでデータベースを起動します。

```PHP:ターミナル
sudo systemctl start mariadb
```

下記コマンドで起動できたかを確認します。

```PHP:ターミナル
sudo systemctl status mariadb
```

緑の文字で`active (running)`と出ていればOKです。

3.データベースのrootパスワードを設定します。

まずは下記のコマンドを入力します。

```PHP:ターミナル
sudo /usr/bin/mysql_secure_installation
```

次からどんどん質問が出てくるので答えていきます。

`Enter current password for root (enter for none):`→Enterキーを押す。
`Set root password? [Y/n]`→「Y」を入力してEnterキーを押す。
`New password:`→ご自身で決めたパスワードを入力する。(画面には表示されないけど入力できています)
`Re-enter new password:`→もう1度ご自身で決めたパスワードを入力する。
`Remove anonymous users? [Y/n]`→「Y」を入力してEnterキーを押す。
`Disallow root login remotely? [Y/n]`→「Y」を入力してEnterキーを押す。
`Remove test database and access to it? [Y/n]`→「Y」を入力してEnterキーを押す。
`Reload privilege tables now? [Y/n]`→「Y」を入力してEnterキーを押す。

4.データベースに接続を確認します。

下記コマンドでデータベースに接続できるか確認します。

```PHP:ターミナル
mysql -u root -p
```

パスワードを求められるので入力しEnterキーを押します。

```PHP:ターミナル
MariaDB [(none)]>
```

上記のように表示されれば接続できています。
抜け出したいときは`exit`で抜け出せます。


## Laravel環境設定

参考記事：[AWSにEC2上にdockerを使用したlaravelをデプロイ④（gitクローン〜デプロイ、マイグレーション）](https://qiita.com/JXnj8uVrUkiBh90/items/65f55ad1f79f32f26547)

コマンドは全てEC2インスタンス内で行います。

1.下記コマンドでコンテナ内に入ります。

```PHP:ターミナル
docker-compose exec app bash
```

2.下記コマンドで.envファイルを作成します。
.envファイルはgitリポジトリにpushされないためです。

```PHP:ターミナル
cp .env.example .env
```

3.下記コマンドでcomposerをインストールします。

```PHP:ターミナル
composer install
```

4.下記コマンドでAPP_KEYを発行します。

```PHP:ターミナル
php artisan key:generate
```

5.下記コマンドで権限を変更します。

```PHP:ターミナル
chmod 777 storage/logs vendor
chmod 777 storage/framework/views
chmod 777 storage/framework/sessions
```

6.画像投稿がある場合は下記コマンドも必要みたいです。

```PHP:ターミナル
php artisan storage:link
chown -R www-data:root .
```

7.下記コマンドでマイグレーションを実行します。

```PHP:ターミナル
php artisan migrate
php aritsan db:seed
```

以上で無事にデプロイ ができました。

ただ、現在S3への画像の保存ができない状態なので解決出来次第修正致します。