EC2/Docker/Laravelでデプロイ

#経緯

Laradocを使ったWebアプリの開発の勉強を始めています.

AWSとLaravel,docker,docker-compose勉強し始めて、１ヶ月ほどたって、
Docker/Doker Compose/AWSの使い方にはなれてきたので、Laradocでデプロイしてみたいなぁと思って、自分の勉強のために残しておきます。(2020年11月4日時点)

参考にさせていただいたのサイトは下記のところです。

https://laraweb.net/tutorial/6578/
https://noumenon-th.net/programming/2019/06/16/laradock/

参考にした本は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版」です。

docker,docker-composeの基礎知識は下記のudemy講座で勉強しました。

https://www.udemy.com/course/aidocker/

色々な知識与えてくれた上記の作者の方々に感謝です。

では早速やっていきましょう
#ゴール
AWSでどこからでもアクセスできるLaravelのWebアプリをデプロイする。
本来はローカルでLaradoc作って、Webアプリ開発してそれをgit cloneするのだと思いますが、
全部AWSで完結します。

#laravelの実行環境
Ubuntu:18.04
PHP　: 7.3
mysql : 5.4
Docker : 19.03.13
Docker-compose : 1.17.1


##リージョンの選定

東京リージョンで作成しましょう

## VPCの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/5e5c3c8d-ad4e-a9a0-91d3-589265c21efa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/5f69b068-6463-ddae-32ec-22e98cf6df2e.png)

1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPｖ４　CIDRブロックは10.0.0.0/16
         パブリックサブネットのIpv４　10.0.0.0/24にしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/e907c9f1-d421-d13d-99d8-29b860a17b49.png)

VPC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/6a0fe98e-3176-6b58-2f34-5183c03446a4.png)

## EC2インスタンスの作成

EC2をコンソールから選択してインスタンスを起動をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/691ce659-d572-b287-5fa7-48a9ce512fc5.png)

Ubuntu 18.04を選択
ステップ２でt2.microを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/efc643b9-f681-7338-767f-01c9f8fb74fa.png)

ステップ３　インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/0610ebcd-ae53-1d0f-e3ae-5b82bae07305.png)

ステップ６　セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/ad7df93f-0cc2-4444-6360-33cfd6454bbd.png)

ステップ７　で起動をクリック。
　　　　　　SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/0125ec0f-06f8-7db0-ff33-710895dc14f7.png)

この間で、mykey.pemの認証をしましょう。

ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
``` chmod 400 mykey.pem```
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html

しばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/7ee3781a-a5f4-5ff4-9569-335b7732ceee.png)

SSH接続する場合は下にあるところ（コピーされたコマンドをクリック）したらいいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/a55ba871-2aef-0b68-f858-2baf4e43cde4.png)

ターミナルを開いて
mykey.pemのあるディレクトリに移動(cd)

先程AWSでコピーした
```ssh ~~~```
をターミナルに貼り付け。Enter

そしたら先程作成したEC2に入れます。
その後、
```yes```と入力
ここまででEC2の起動は終わりです。

#EC2の中で、Docker,Git,Docker-composeをインストール
~~~
ubuntu@ip-10-0-0-205:~$ sudo su
root@ip-10-0-0-205:/home/ubuntu# 
~~~

以下root内での作業


じゃんじゃん下のコマンド打っていきましょう
apt-getのアップデートして,gitをインストール
```apt-get update```
```apt-get install git```

dockerとdocker-composeをインストール

~~~
$ apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ apt-key fingerprint 0EBFCD88

$ add-apt-repository \
                      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
                      $(lsb_release -cs) \
                      stable"
$ apt-get install docker-ce docker-ce-cli containerd.io

$ apt install docker-compose
~~~

```
exit
```
でrootから抜け出す

# Laradocをgit cloneする。
https://laradock.io/

~~~
git clone https://github.com/Laradock/laradock.git
~~~
lsでgit cloneされているか確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/9278a506-1ba4-d41c-d552-5c5b2fa8a4bb.png)

```$ cd laradock```として
```$ cp env-example .env```
とりあえず、PHP=7.3
mysqlで実行することにしてみましょう。
実行。

```
docker-compose up -d nginx mysql
```
してnginx mysqlのdockerを起動。
10分ほどまちます。Youtubeでも見ながらゆっくりしましょう。

#workspaceコンテナに入ります。
dockerのインストールが終了したら、下記コマンド実行して、
workspaceで作業しましょう。

```
docker-compose exec --user=laradock workspace bash
```

でworkspace内で、docker-compose 起動します。

そうすると、```var/www$```に移動します。
laradockフォルダがあるので、

```$ cd laradoock```
として、.envファイルを編集します。
```$ cp env-example .env```
しましょう

下記を```.env```に追加
```vi .env```実行して下記追加。

```
DB_HOST=mysql
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

##LaravelでWebアプリの作成

今回はサンプル用のアプリ名をSampleProjectとします。

```
laradock@e00afef1d36e:/var/www$ composer create-project laravel/laravel SampleProject "5.5.*"
```

そしたらSampleProjectができます。

```
var/www --- laradock
         |_ SampleProject
```
という構成になります。

SampleProjectに入って.envを編集。

```
DB_CONNECTION=mysql 
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```
としてDB_HOSTをmysqlにします。

そして,Laradock内の.envを下記の通り編集して、起動するlaravelアプリを選択。
ここを記述しないと認識されないんだと思います。

```
APP_CODE_PATH_HOST=../SampleProject
```

とりあえずの設定は終わりました。

laradocのファルダに移動して、docker-compose再起動して、変更を読み込み。


```

docker-compose up -d nginx mysql phpmyadmin

```

あと少しでラストです。
##Laravelの初期画面表示

EC2のパブリックIpv４　DNSをコピーして、
ブラウザのURLバーに貼り付け。(URLはElastic IPで固定にしてもいいですが、今回はしません。)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/afad51fc-f102-9652-77f7-9f691c7a38d5.png)

いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129576/b2d4e000-6e69-ae1e-150a-6f408b03dc61.png)


#EC2再起動したときの注意事項
1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。

```
sudo su
cd laradock/
docker-compose up -d nginx mysql phpmyadmin
````

2)EC2停止したときは、Ipアドレス変わっているので、
　Elastic IPで固定化しましょう。

3) Laradockのファイル変更したら
```docker-compose up -d mysql　phpmyadmin```
しましょう。
編集するファイルはもちろんSampleProject。


#所感とこれから
EC2使って立ち上げるのに、すごい便利だなと思いましたし、デプロイできると嬉しいですね、
ただ、EC2再起動したあとのDocker-composeの立ち上げとか、
EC2立ち上げたときに、gitとかDocker/Docker-compose入れるの手間だなと思っちゃいました。

これからは発展的な内容としてEC2の冗長化とECS(Fargate),CI/CDも勉強しようとおもいます。

なにか、みなさまの参考になれば幸いです。

以上