🌐

LaravelアプリをEC2にデプロイする際に、つまずいたポイント

2024/06/04に公開

はじめに

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