エンジニア

知識ゼロのAWSのEC2でdockerを使ってlaravelを立ち上げる方法

Cloud Upload Icon Line Connection of Circuit Board

こんにちは。もんしょー(@sima199407)です。

最近仕事でAWS(Amazon Web Service)を使うことになったので、

解説していきたいなと思います。

今回は、以前使った「dockerを使ってLaravelをデプロイする」記事に関連して、

AWS上にも構築することを目標としてます。

ポイントは以下の通り

・EC2orECSどっち使う?
・dockerを入れることは難しくない
・ちょっと面倒なのは、Laravelの設定

ということで書いていきましょう!

環境

今回使用した環境

AWS EC2
Ubuntu Server 18.04 LTS
PHP7.2
laravel5.6
nginx

ECSってなんなのさ?

AWSでdockerを立ち上げるときに

「EC2とECSどっち使えばいいの?」

ということがあるかと思います。

僕も最初よくわかってなかったのですが、

EC2とは、
→webサービスを全般を扱うことができる

ECS
→EC2をベースにいくつかのdockerを構築できる

同じように見えますよね。笑

-ECSの凄みは上記に書いてあるとおり、複数のdockerが作成できるところで、これらの集合体を「クラスター」と呼びます。

-そんなことしたらポート管理が大変かと考えるかもしれませんが、実はポート振り分けをAWS側でやってくれるんです。(ポートマッピング)

dockerを触ったことがある人は、docker-compose.ymlにポートを書いて、

コンテナ同士でかぶらないように手動でやってましたが、

それが必要ないんです。

正確にはECSではなくALBという機能なのですが、本当に便利ですね。

【公式】AWSのポートマッピング

ECSとは、「複数のEC2を管理する仕組み(みたいなもの)」

今回の目標

AWSのEC2を使ってlaravelの最初の画面を表示する

これです。

ECSが便利なのはわかるんですが今回はEC2を使ってやります

イチから設定をしていくので、
不要な部分があればとばしてもらって大丈夫です。

AWS マネジメントコンソール

まずAWSにログインします。

まだ、アカウントを作成していない場合はこちらからどうぞ。

インスタンスの作成

ログインしたら、トップバーの「サービス」から

「コンピューティング」→「EC2」を選択します。

EC2のダッシュボードに切り替わるかと思いますが、

次にサイドバーの「インスタンス」カテゴリーの「インスタンス」を選択します。

「インスタンスの作成」を選択します。

今回は「Ubuntu Server」というOSを使って構築したいと思います。

インスタンスの設定

主に変更する点は以下の部分

2: インスタンスタイプの選択
3: インスタンスの詳細の設定
6: セキュリティグループの設定

「インスタンスタイプの選択」は無料枠の「t2.micro」

「インスタンスの詳細の設定」は「削除保護の有効化」→「誤った削除から保護します」にチェック
これを入れておくと後でインスタンスを削除するときに一手間加わり、誤って削除をするのリスクを防ぎます。

セキュリティグループの設定」は主にポートの許可をします。
ここが設定されていないと、Chromeなどのブラウザからアクセスすることができないです。

以下のような感じにします

今回は、
ssh接続用の「22」に加えて
webサーバーnginxの「80」
MySQLの「3306」
phpmyadminの「8080」
を許可しておきます。

ソースは、
ssh用のポート22は「マイIP」
ssh以外は「任意の場所」でオッケーです。

そして、すべての設定が終わったら

7: インスタンス作成の確認」にクリックして、右下の「起動」を押してインスタンスを作成します。

完了したらssh接続のため、
インスタンスの「接続」をクリックして指示に従います。

やること

①キーを取得する
②キーのパーミッションを変更
③ターミナルでインスタンスに接続

という形でターミナルの中に入ります。

dockerをインストール

ここからdockerをインストールしていきます。

※ubuntuのコマンドなので、centOSを普段使われている方は少し違うかもです。

スーバーユーザーになる

ubuntu@ip:~$ sudo su

aptを更新

root@ip:/home/ubuntu# apt-get update

gitをインストール(laravelをインストール編で使います)

root@ip:/home/ubuntu# apt-get install git

gitの初期設定

root@ip:/home/ubuntu# git config --global user.name [任意のユーザー名]
root@ip:/home/ubuntu# git config --global user.email [任意のemailアドレス]

dockerインストール

root@ip:/home/ubuntu# apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common
root@ip:/home/ubuntu# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -root@ip:/home/ubuntu# apt-key fingerprint *********
root@ip:/home/ubuntu# add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) \stable"
root@ip:/home/ubuntu# apt-get install docker-ce docker-ce-cli containerd.io

docker-composeインストール

root@ip:/home/ubuntu# apt install docker-compose

ここまでで一通りのdockerインストールは完了です。

laravelをインストール

次にlaravelのインストールですが、

以前の僕が書いたdockerでlaravelを構築の「秘密鍵の設定」までやればオッケーです。

最後の設定

ここから僕が詰まったところになるので少し丁寧にいきます。

laravel側の設定

現在の状況でインスタンスのパブリックDNSにアクセスすると以下のエラーが出ているかと思います。

【エラー1】
The stream or file “/var/www/html/sample/storage/logs/laravel.log”could not be opened: failed to open stream: Permission denied

そのlaravel.logが開けないからパーミッションを変えてくれとのことです。

対処法はシンプルにパーミッションを変えて上げる

chmod 777 storage/logs

パーミッション777は誰でも書き込み可能なディレクトリですので、セキュリティ的には甘いですので注意を。

【エラー2】
file_put_contents(/var/www/html/sample/storage/framework/views/1ce3e04b775dbb480db046db9ec317424bc554f2.php):failed to open stream: Permission denied

対処法は先程と同じです

chmod 777 storage/framework/views/

この2つを行えば以下の画面になるはずです。

phpmyadmin側の設定

laravelの初期画面が見えたら次にphpmyadmin(ポート8080)にアクセスしましょう

多分入れないんじゃないかと思います。笑

【対処法1】
まずはポートの確認ですね。

ターミナル

chmod 777 storage/framework/views/

でphpmyadminのポートを確認します。

0.0.0.0:8080->80/tcp
ようになっているのを確認。

次にAWSのセキュリティグループを確認します。

「インバウンド」タブをリストを確認してポート番号8080が設定されていることを確認しましょう。

【対処法2】

phpmyadminにアクセスはしたけど、以下のエラーが出たとき

ERROR 1045 (28000): Access denied for user ‘ユーザー名’@’IPアドレス’ (using password: YES)

原因はユーザーの権限がないからでして、
dockerのmysqlコンテナをイジる必要があります。

ターミナルでdockerのmysqlコンテナ内に入ります。

docker exec -i -t [mysqlのコンテナID] bash

次にmysql自体にログインします。今回はrootで入ります。

mysql -u root -p

するとパスワードを求められますが、設定をしていないのでそのままEnterで入れるかと思います。

mysql>

上記のようになっていればログイン成功

以下のコマンドを入力します

grant all privileges on *.* to 'ユーザ名'@'ホスト名' identified by 'パスワード名' with grant option;

ユーザー名はroot
ホスト名はIPアドレス
パスワード名はdocker-compose.ymlで設定したものにします。

そして入力した内容を保存するため以下をコマンド

flush privileges;

ここまでやったらブラウザでphpmyadminにアクセスしてみてください。

アクセスできていれば成功。

よくある質問

Q、ssh port 22 Operation timed outになったら?
→sshのポート設定を確認してみてください。

【確認方法】

インスタンス→「説明」タブ→「セキュリティグループ」の(lanch~みたいになっている)ところをクリック

セキュリティグループのページに来たら「インバウンド」タブの「編集」をクリック

SSHの部分が「マイIP」に変更する。

そしたらインスタンスを再起動する。

もう一度sshでログインしてみてください。

参考記事→https://qiita.com/yokoto/items/338bd80262d9eefb152e

まとめ

ここまでの設定でほぼ1日かかりました。

一度設定してしまえば頻繁変更することはないかと思いますので、最初だけがんばりましょう。

参考になった記事を紹介
https://qiita.com/heyhey1028/items/6f6321e46cf8e3efabc1
https://teratail.com/questions/45324
https://qiita.com/naka46/items/e562e38764441d2b5b4a
https://qiita.com/reflet/items/3b818fbfb14ba5c7ef47