LaravelアプリをEC2にデプロイする際に、つまずいたポイント
はじめに
Laravelで作成したアプリを初めてEC2にデプロイする際に、いくつか沼にハマったポイントがあったので今度のためにも記録に残そうと思います。
EC2インスタンスの作成方法などは、たくさん情報があると思うので省略します。
つまずきポイント
Dockerで開発したプロジェクトをそもそもどうやってデプロイするの?
ローカルではDocker-composeで環境構築しており下記のようなディレクトリ構成のリポジトリとなっていました。
.
├── documents
├── infra
├── src
├── docker-compose.yml
└── README.md
src/のLaravelのディレクトリだけ、Apacheのvar/www/html/に配置したいのだけど。。。
そのほかのディレクトリはgit clone
したくないな。。。
src/だけサブモジュール化したほうがいいのか?サブモジュールの使い方として正しいのか?
色々悩んだ結果、EC2のルート直下にアプリのリポジトリをgit clone
してsrc/をvar/www/html/にコピーすることにしました。
具体的には下記の流れ↓
まずはsshでEC2にログイン
ssh -i ~/Desktop/test.pem ec2-user@××.××.××.×××
EC2サーバーのルートディレクトリでgit pull(cloneしている前提)する
[ec2-user@ip-××-×-××-××× ~]$ git pull
pullしたLaravelプロジェクト(src/)をApacheの/var/www/html/にコピー
[ec2-user@ip-××-×-××-××× ~]$ sudo cp -r /hoge/src/* /var/www/html/
Laravelのアプリのみをgitで管理しているならば/var/www/html/にてgit pull
するだけで済むのですが、Dockerfileなどもgitで管理している関係で上記のような面倒な手順となりました。
今後はシェルスクリプトを使ってもう少しデプロイを簡単にしたいですね。その後CI/CDパイプラインの構築にも挑戦したいです。
EC2にてLaravel等のプロジェクトをクローンした後に、composer installができない
The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied
上記のようなエラーが出て、composer installが最初できませんでした。
エラーの内容としては権限の問題のようです。
原因としては、所有者がapacheのままでec2userに変更していないためです。
下記コマンドで/var/www/htmlの所有者をapacheからec2userに変更します。
chown
とはファイル/ディレクトリの所有者を指定したものに変更するコマンド
-R
で配下のディレクトリやファイルをまとめて変更
sudo chown -R ec2-user:apache /var/www/html
Class "App\Services\ImageService" not found エラー
Laravelでサービスに切り離した、ImageServiceクラスが見つからないというエラー。
気付くまで結構時間がかかったのですが、Laravelのapp\Services\imageService.phpのファイル名の頭が小文字になっていました。。。
ローカルでは大文字小文字はよしなに判断してやってくれたようですが、本番環境ではエラーになりました。
単純にファイル名を後から変更しても、gitはその変更を差分を判定してくれないので、下記コマンドでファイル名変更したよーとgitに伝える必要があります。
mv app/Services/imageService.php app/Services/ImageService.php
必要に応じてキャッシュクリア
php artisan optimize:clear
さいごに
今回初めてAWS上にデプロイをしてみました。
開発では、Dockerを使っているので、コンテナ関連のECSやECR、Fagateなど最新のサービスなども積極的にキャッチアップしていきたいです。
Discussion