AWSにLaravel+Laradockをデプロイしてみる

はじめに

AWSへのデプロイに挑戦してみました。

✅ゴール
・AWSの理解を深める

✅環境
Windows/Docker

✅参考教材
💻AWS EC2にLaravel+Laradockをデプロイ(イントロ)

メインの内容

✅VPCとサブネットの作成 

参考:AWS EC2(VPCの作成)

①AWSへログインする。

※久しぶりにCloud9開いて気づいたけどリージョンがオハイオになってました。笑 このあと東京に変更しました。

②VPC管理ページを開く

VPC作成ウィザードSTEP1

VPC作成ウィザードSTEP2

作成するとVPC自体とサブネットが一緒に作成される。

✅EC2インスタンス(サーバー)作成

参考:AWS EC2(インスタンスの作成)

AMIはubuntu16.04を選択(Laradock環境に合わせてる)。

※以前作成したLaravel+Laradockプロジェクトで確認

\laravel-sns-mysql-copy\laradock> docker-compose up -d nginx mysql workspace phpmyadmin
  Creating network "laravel-sns-mysql_frontend" with driver "bridge"
  Creating network "laravel-sns-mysql_backend" with driver "bridge"
  Creating network "laravel-sns-mysql_default" with the default driver
  Creating laravel-sns-mysql_docker-in-docker_1 ... done
  Creating laravel-sns-mysql_phpmyadmin_1 ... done
  Creating laravel-sns-mysql_workspace_1 ... done
  Creating laravel-sns-mysql_php-fpm_1 ... done
  Creating laravel-sns-mysql_nginx_1 ... done

\laravel-sns-mysql-copy\laradock> docker-compose exec workspace bash
root@2763c846a7f5:/var/www# cat /etc/os-release
  NAME="Ubuntu"
  VERSION="16.04.6 LTS (Xenial Xerus)"
  ID=ubuntu
  ID_LIKE=debian
  PRETTY_NAME="Ubuntu 16.04.6 LTS"
  VERSION_ID="16.04"
  HOME_URL="http://www.ubuntu.com/"
  SUPPORT_URL="http://help.ubuntu.com/"
  BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
  VERSION_CODENAME=xenial
  UBUNTU_CODENAME=xenial

インスタンスタイプは無料のt2.microを選択

詳細設定で先ほど作成したVPC(ネットワーク)、サブネット、有効を選択。

ストレージは変更なし

インスタンスの区別ができるようにタグを作成

セキュリティーグループでHTTPの80ポートも追加

最後にキーペアを作成してダウンロード。

✅Elastip IP(EIP)の紐づけ

参考:AWS EC2(Elastic IPの作成)

EC2ダッシュボードの左側メニューにある⇒右側の割り当て⇒割り当てをクリック⇒作成したIPアドレスをメモ。

EC2と関連付けする(この後EC2インスタンスを選択)。

✅SSHログイン

参考:EC2 にSSHでアクセス

PoderosaでSSH接続

👇スターウォーズで起動したら認識するのに時間かかったけどこれでOKらしいです。笑

✅ソフトインストール

参考:EC2 にソフト(Git/Docker/Docker Compose)のインストール

スーパーユーザーへの切替

ubuntu@ip-10-0-0-251:~$ sudo su
root@ip-10-0-0-251:/home/ubuntu#

パッケージ管理システムの更新

apt-get update

Gitのインストール

apt-get install git
git config --global user.name 任意のユーザー名 // chobi1125
git config --global user.email 任意のemailアドレス // ~~@yahoo.co.jp

Dockerのインストール

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

※自分の場合はこれだとエラーが出たので公式を参考にインストールしなおしました。

参考:UbuntuにDocker Engineをインストールする(公式)

Docker Composeのインストール

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

※こちらと公式参考にするもdocker-composeコマンドが使えなかったのでQiita記事を参考にインストールしなおし。

参考:AWS EC2インスタンスにdockerとdocker-composeをインストールして簡単なWEBサービスを立ち上げる方法

sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

✅Gitクローン&Docker起動

参考:Gitクローン&Docker起動

git clone

root@ip-10-0-0-251:/home/ubuntu# pwd
>> /home/ubuntu
git clone --recursive https://github.com/honjou/laravel_app4

laradock/.env作成

cd laravel_app4/laradock
cp env-example .env

.envの修正

$ vi .env

# Laravelの格納場所を変更
APP_CODE_PATH_HOST=../src/

# PHPのバージョンを設定
PHP_VERSION=7.3

# MySQLのバージョンを設定
MYSQL_VERSION=5.7

Vimを覚える必要がありますね! 参考

escで編集モードからコマンドモード。:wqでセーブして終了。

docker起動

docker-compose up -d apache2 mysql

起動したっぽい

✅Laravelの環境構築

.gitignoreでGitHubのリポジトリにプッシュされていなかった内容をEC2インスタンス内に作ってあげる。

参考:Laravel 環境設定

workspaceコンテナに入る

docker-compose exec workspace bash

laravel/.envの作成と編集

/var/www# cp .env.example .env
/var/www# vi .env
~~~~.envを以下のように編集
DB_HOST=mysql
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

composerをインストールしてvendorディレクトリを生成

/var/www#composer install
/var/www# php artisan key:generate // インストール後、APP_KEYを発行。

IPアドレスにアクセスすると以下になる。http://18.181.70.9/

※以下google翻訳
UnexpectedValueException
ストリームまたはファイル “/var/www/storage/logs/laravel.log”を開けませんでした:ストリームを開けませんでした:権限が拒否されました

storage/framework/viewsの権限を変更

/var/www# chmod 777 storage/logs vendor
/var/www# chmod 777 storage/framework/views

表示された

ついでにログイン機能が既に実装されていたのでマイグレートして試してみる。

root@cf1b3954eeb1:/var/www# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.03 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.03 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)

ログインできた◎

追加で試したこと

✅Linuxコマンドでのディレクトリ名変更 参考

mv laravel_app4 laravel

✅Docker-compose upコマンドを変えて試す

docker-compose up -d nginx mysql workspace phpmyadmin
docker-compose up -d apache2 mysql // アレンジ前

起動した&ログイン状態が保持されたのでデータの永続化もできてるっぽい。

保存先が不明だったので確認

laradock/.env

DATA_PATH_HOST=~/.laradock/data

~/UNIX系のOS(LinuxとかMacとか)における、ホームディレクトリ(ログインした直後にいるディレクトリ)を表すマークらしい。

ログイン直後のディレクトリは以下なので該当のディレクトリが見当たらない。。。

Last login: Wed May 20 03:13:55 2020 from 106.154.136.52
ubuntu@ip-10-0-0-251:~$ ls
laravel

よくわからないので変更することにします(※ついでにやんばるさん教材デプロイ前提で諸々変更)。

laradock/.env

APP_CODE_PATH_HOST=../laravel/
DATA_PATH_HOST=../data
COMPOSE_PROJECT_NAME=laravel-sns

上記に伴いディレクトリ名変更

cd ..
mv src laravel
~~起動して確認
root@ip-10-0-0-251:/home/ubuntu/laravel# ls
data  laradock  laravel  README.md

dataディレクトリが作成されていることを確認。

再度マイグレーション

cd laradock
docker-compose exec workspace php artisan migrate

その後同じように新規登録ができるか確認して完了◎

自作プロジェクト(やんばるさん教材)をデプロイ

①GitHubでリポジトリ作成&プッシュ

※マイグレーションファイルの最新版をプッシュできなかったので2周しております。ところどころ注釈で2周目と記載します。

②クローンする

cd laravel
git clone https://github.com/chobi1125/laravel-sns-mysql.git

③ファイル名をlaradock/.envに合わせて変更

mv laravel laravel-default
mv laravel-sns-mysql laravel

④コンテナを起動してLaravelの環境構築

docker-compose up -d nginx mysql workspace phpmyadmin
docker-compose exec workspace bash // コンテナに入る
~~~~コンテナ内
cp .env.example .env
vi .env
~~~~.envを以下のように編集
DB_HOST=mysql
DB_DATABASE=default // 2回目はlarasns
DB_USERNAME=default // 2回目はroot
DB_PASSWORD=secret // 2回目はroot
~~~~コンテナ内
composer install
php artisan key:generate
chmod 777 storage/logs vendor
chmod 777 storage/framework/views
php artisan migrate</pre>

※chmodはファイルやフォルダのパーミッション、アクセス権限を設定するLinuxコマンド。777はすべてのユーザーに権限付与。 <a href="https://eng-entrance.com/linux-command-chmod">参考</a>

※逆にこれで権限が戻るらしい。sudo chmod 0755 . <a href="https://www.techpit.jp/courses/735598/lectures/13335007">参考</a>

ここまでで確認して以下のようなエラー。

<img class="alignnone wp-image-2719" src="https://chobimusic.com/wp-content/uploads/2020/05/17-5.jpg" alt="" width="1166" height="648" />

<a href="https://teratail.com/questions/210969">コチラ</a>を参考に<span style="color: #ff0000;"><strong>npm install</strong></span>

<pre class="ql-syntax" spellcheck="false">~~~~試しにコンテナ外で
docker-compose exec workspace npm install
docker-compose exec workspace npm run dev

以下のようなエラーが出る

98% after emitting SizeLimitsPlugin

ERROR Failed to compile with 1 errors 6:13:07 AM

error in ./resources/js/app.js

Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: Cannot find module '@babel/compat-data/corejs3-shipped-proposals'

が、とりあえずトップ画面の表示はされた。

ところが投稿機能を試そうとするとこうなる。

再度マイグレーションでエラーになる。

docker-compose exec workspace php artisan migrate
>> SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'articles' already exists

試しにディレクトリを削除することを思いつく。

rm -r data

確認。狙い通り。

再度マイグレーションでこうエラーが出る。

SQLSTATE[HY000] [1049] Unknown database 'default'

再度docker-compose down&upしてマイグレーションでこうエラーが出る。

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `articles` add constraint `articles_user_id_foreign` foreign key (`user_id`) references `users` (`id`))

mysqlコンテナへログインしてDBを削除する。

docker-compose exec mysql bash

ログイン

mysql -u root -h localhost -p //passwordはroot
~~~~mysql内
mysql> show databases; // データベース確認
+--------------------+
| Database           |
+--------------------+
| information_schema |
| default            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
mysql> use default; // DBを選択
mysql> show tables; // テーブルを確認
+-------------------+
| Tables_in_default |
+-------------------+
| articles          |
| failed_jobs       |
| migrations        |
| password_resets   |
| users             |
+-------------------+
5 rows in set (0.00 sec)
DROP TABLE articles; // 問題のテーブルを削除
create database larasns; // テーブル作成
mysql> quit; // ログアウト

laravel/.envを編集

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=larasns
DB_USERNAME=root
DB_PASSWORD=root

マイグレートし直すも再度同じエラー(そりゃそうなんだけども。。。)。

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `articles` add constraint `articles_user_id_foreign` foreign key (`user_id`) references `users` (`id`))

仕方ないのでマイグレーションファイルの確認(ディレクトリ確認してファイル名をコピペしてアクセス)。

docker-compose exec workspace vi database/migrations/2020_03_17_170647_create_articles_table.php
docker-compose exec workspace vi database/migrations/2014_10_12_000000_create_users_table.php

案の定そろっていないことを確認!!(てかなぜ間違ったデータをプッシュしたんだろう??)

👉原因発覚。過去のデプロイの状態がプッシュされていたっぽい。

\laravel-sns-mysql\laravel> git commit -m "first commit"
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
modified: database/migrations/2020_03_17_170647_create_articles_table.php
modified: database/migrations/2020_03_18_205404_create_likes_table.php
modified: database/migrations/2020_03_19_173524_create_article_tag_table.php
modified: database/migrations/2020_03_19_183737_create_follows_table.php

no changes added to commit

どうやらGitHubの指示に従ってgit add .を忘れたことが原因ぽい。

ってことで気を改めて。。。

git remote rm origin
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/chobi1125/laravel-sns-mysql.git
git push -u origin master

今度はしっかりGitHub上を確認。変更が反映されている!!

のでクローンしてやり直しました。。。

2回目。投稿まではできたもののなぜかいいね機能が消えている。

どうやらVue.jsファイルは読み込めていないらしい。

ソースにもjsがないので当たり前ですね。。。

確認

docker-compose exec workspace vi public/js/app.js

ファイル自体はあることが発覚。。。

Google devtoolで以下エラーを確認

Uncaught Error: Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: Cannot find module '@babel/compat-data/corejs3-shipped-proposals'
Require stack:

同様のエラーを出してる方の記事を参考にするもpackage.jsonにそれらしき記載はない。参考

更に探してpackage-lock.jsonで発見。

まあものは試しといった感じでここに追記してnpm run dev

再度npm i&npm run devをすると成功◎

確認すると表示もされた!!

次ははLaravel Debugbarを消します

docker-compose exec workspace vi .env
~~~~laravel/.envの中
APP_DEBUG=false // trueから変更すればOK

最後にグーグル認証の実装をします 参考

現状はグーグルログインしようとすると以下のようにエラーが出ます。

 

Google API Consoleにアクセス⇒APIとサービス(ハンバーガーメニュー)⇒認証情報⇒OAuth2.0クライアントID⇒承認済みリダイレクトURIの追加で以下追記

http://<EC2のIPアドレス>/login/google/callback

で行くと思いきや、どうやら外部IPアドレスをせっていすることはできないらしい。。。

試しにPostgreSQLを使ってみる

起動

laravel/laradock# docker-compose up -d workspace php-fpm nginx postgres
Creating laravel-sns_postgres_1         ... done
Creating laravel-sns_docker-in-docker_1 ... done
Creating laravel-sns_workspace_1        ... done
Creating laravel-sns_php-fpm_1          ... done
Creating laravel-sns_nginx_1            ... done
/laravel/laradock# docker-compose ps
             Name                           Command              State                    Ports
-----------------------------------------------------------------------------------------------------------------
laravel-sns_docker-in-docker_1   dockerd-entrypoint.sh           Up      2375/tcp, 2376/tcp
laravel-sns_nginx_1              /bin/bash /opt/startup.sh       Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laravel-sns_php-fpm_1            docker-php-entrypoint php-fpm   Up      9000/tcp
laravel-sns_postgres_1           docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
laravel-sns_workspace_1          /sbin/my_init                   Up      0.0.0.0:2222->22/tcp

dataディレクトリを確認してみると中身もちゃんとある!!

/laravel/data# ls
dind mysql postgres
/data/postgres# ls
base          pg_dynshmem    pg_logical    pg_replslot   pg_stat      pg_tblspc    pg_wal                postgresql.conf
global        pg_hba.conf    pg_multixact  pg_serial     pg_stat_tmp  pg_twophase  pg_xact               postmaster.opts
pg_commit_ts  pg_ident.conf  pg_notify     pg_snapshots  pg_subtrans  PG_VERSION   postgresql.auto.conf  postmaster.pid

laravel/.envの変更

docker-compose exec workspace vi .env

※変更前docker

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=larasns
DB_USERNAME=root
DB_PASSWORD=root

※変更後

DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=larasns
DB_USERNAME=default
DB_PASSWORD=secret

DB作成。

docker-compose exec workspace psql -U default -h postgres
default=# create database larasns;
>> CREATE DATABASE
default=# \q
docker-compose exec workspace php artisan migrate

永続化も確認できた◎

※この後MySQLを起動したら500エラーが出るようになってしまいました。。。dindフォルダを共有するのが影響??
ローカルでは共存できたけど(WindowsだとPostgreSQLのマウントができないのが良くも悪くも起因していそう)、いずれにせよ不要だしあまりいろいろと試すのは良くなさそうですね。。。

独自ドメインの取得

上記の延長でGoogle認証が外部IPアドレスの設定ができないことが発覚したので設定していきます。 参考

AWSは登録から1年間以下のサービスが無料で使えるそうです。

  • EC2:1台(1ヶ月の合計可動時間が750時間まで) → 2台インスタンスを作成しても合計稼働時間が750時間までは無料
  • RDS(データベースサービス)1ヶ月の合計可動時間が750時間まで
  • S3 5GBまで

✅route53の紐づけを試す 参考

route53の設定

DNS管理を今すぐ始める⇒ホストゾーンの作成

ここの値をメモる

その後、ドメインとEC2インスタンスのIPアドレス(※IP V4パブリックIP)を紐づける。
※①で作成したドメインのホストゾーンのレコードセット作成(Aタイプ)で追加。

②Xドメイン&お名前.comの設定

僕の場合はXserverで以前購入していたのでXserver(Xドメイン)にログイン。

ネームサーバーを変更

と、ここでエラー。どうやら.funや.siteは登録できないらしい。。。参考
⇒これはRoute53で購入する場合っぽい。。。教材でここに載っていない.workでドメイン追加できてる。

メモったネームサーバーの文末「.」を消すことで登録できました。

お名前.comでも試す。

デフォルトのページ(わかりやすい)

ネームサーバーをRoute53でメモった4つのネームサーバーに変更

どうやら反映完了まで時間かかるっぽい。しばし待つことに。

2,3時間後、先にXserverの方で反映されました(知っていたらお名前.comでドメイン化ってなかった。。。笑)。

※さらにその10分後くらいにお名前.comでも紐づけ完了。調べたら料金掛かるみたいなので即解除。(これはすぐ反映された。)

 

✅常時SSL化 参考(教材8-3)

現状、https://でアクセスしようとするとエラーになるのでhttps通信ができるようにします。

①ACMで証明書発行
②ELBでhttps通信可能に(※ELBは1日約65円かかるらしい。。。)

①ACM(AWS Certificate Manager)

※リージョンは忘れずに変更!

証明書のプロビジョニングを今すぐ始める
⇒パブリック証明書のリクエストで証明書のリクエストをクリック
⇒取得したドメイン名を追加してこの証明書に別の名前を追加をクリック
⇒更に*.取得したドメイン名を追加して次へをクリック(※今後の拡張でサブドメインを使えるようにするため)
⇒DNSの検証を選択して次へをクリック
⇒念のためタグを管理しやすいように入力。タグ名:name 値:ドメイン名
⇒確定とリクエスト
⇒DNS設定ファイルをダウンロード

Route53へ移動(ホストゾーン⇒ドメイン名)
⇒レコードセットの作成
⇒ダウンロードしたDNS設定ファイルを開く
⇒RecordNameのドメインより前の部分を名前に、タイプはCNAMEを、RecordValueをすべてコピーして値にペーストして作成。
⇒入力後15分弱待ってACMで状況が発行済みになっていればOK。

②ELB立ち上げ

EC2サイドバーからロードバランシング/ロードバランサーをクリック
⇒ロードバランサーの作成、HTTP/HTTPS作成をクリック
⇒細かいので割愛(HTTPSプロトコルを追加する)

※と、ここで以下のようなエラーになってしまったので中断します。結構手間かかるのと、有料なのが釘を刺してしまいました。

参考:お名前.comで取ったドメインをAWSの「Route 53」で利用する
⇒この記事を読むとRoute53は無料枠がなく月々100円くらい料金が発生することがわかる。

メモ

・以下でコンテナログインしなくてもPHPコマンドが実行できる。

docker-compose exec workspace ~~

・EC2インスタンス自体を再起動させてもLaravelディレクトリは残っていたので実質EC2インスタンスを起動させるかでサービスの起動/停止をコントロールできますね!

躓いた点

✅mysqlのログインができない

一度migrateを失敗してしまったのでログインしようと思ったもののなかなかできず。。。

docker-compose exec mysql bash
root@d40e5daf5625:/# mysql -u default -D default
ERROR 1045 (28000): Access denied for user 'default'@'localhost' (using password: NO)

✅docker-compose-downできない 参考

解決:Dockerの使用権限がデフォルトではrootのみに与えられているため。sudo suをすることで解決する。

docker-compose down
>> ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
   If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

✅poderosaでクラッシュしまくる(未解決)

①puttyで接続してみる 参考

公式に書いてあるが、鍵の交換やらuser_nameを合わせたり手間だなと感じたのでステイ

②Tera Termを使ってみる 参考

特におかしなこともしていないはずだが接続できず。。。

👉ユーザー名がec2-userではなくubuntuだということが発覚で解決。参考

※5/31追記

そろそろ諸々整理しないとと思って料金を確認したところ600円ちょいかかってしまっていました。皆さんお気を付けを。。。

EIPの解除はマスト。かなり料金体系が複雑なので個人開発に使うのは正直どうかなと思いました。

おわりに

かなりボリューミーな記事になってしまった(分けるべきだった。。。)。

とりあえずDockerをEC2インスタンスに置けばAWSでRDS(MySQL)とか設定しなくて良い点が気軽でよいですね。

ただちょびっと琉金が気になったので、最後に諸々調べた記事をまとめておきます。

Xserverへのデプロイも試してみようかな??あとはテスト、CircleCI/CDを学んでいきたい。

最後は念のためdocker-compose down&EC2インスタンスをストップさせておきました。笑

✅参考
Docker導入するべき?するべきではない?
Docker とは(AWS公式)
「それコンテナにする意味あんの?」迷える子羊に捧げるコンテナ環境徹底比較 #cmdevio2019 ※どうやらFargateというサービスもあるらしい。
レンタルサーバーより安い?Amazon EC2のコストはどれぐらいかかるのか?

✅関連

Docker for WindowsでLaradock(+MySQL)の環境構築

コメントを残す