はじめに
AWSへのデプロイに挑戦してみました。
✅ゴール
・AWSの理解を深める
✅環境
Windows/Docker
✅参考教材
💻AWS EC2にLaravel+Laradockをデプロイ(イントロ)
メインの内容
✅VPCとサブネットの作成
①AWSへログインする。
※久しぶりにCloud9開いて気づいたけどリージョンがオハイオになってました。笑 このあと東京に変更しました。

②VPC管理ページを開く
VPC作成ウィザードSTEP1

VPC作成ウィザードSTEP2

作成するとVPC自体とサブネットが一緒に作成される。
✅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)の紐づけ
EC2ダッシュボードの左側メニューにある⇒右側の割り当て⇒割り当てをクリック⇒作成したIPアドレスをメモ。

EC2と関連付けする(この後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 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円かかるらしい。。。)
③

※リージョンは忘れずに変更!
証明書のプロビジョニングを今すぐ始める
⇒パブリック証明書のリクエストで証明書のリクエストをクリック
⇒取得したドメイン名を追加してこの証明書に別の名前を追加をクリック
⇒更に*.取得したドメイン名を追加して次へをクリック(※今後の拡張でサブドメインを使えるようにするため)
⇒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のコストはどれぐらいかかるのか?
✅関連
コメントを残す