AWS Elastic Beanstalkを使ったEC2+RDS環境でのLaravelのお手軽デプロイ
趣味でLaravel + Vue.js でいろいろ作ったりしていますが、たまに、「とにかくお手軽に、すぐにデプロイしたい」という時があります。ちょっとデプロイしたい、くらいなら費用的にもherokuとかの方が良いのかもしれませんが、Elastic Beanstalkでも、かなり手間・時間が省けると思い、やってみました。時間は計測してませんが、スムーズに進めば、Elastic Beanstalkでの自動構築時間(10分強)を含めても、30〜40分くらいで完了するのではと思います。
目次
Laravelプロジェクトのzip化
プロジェクトフォルダに入って、そのプロジェクトフォルダをzip化します。
$ zip ../laravel-default.zip -r * .[^.]* -x "vendor/*"
Elastic Beanstalkでの設定・環境構築
1.Elastic Beanstalkの「環境」から「新しい環境の作成」
2.「ウェブサーバー環境」を選択
3.アプリケーション名を指定。ここでは「test_laravel」にしてます。
4.プラットフォームでPHPを選択。環境にあったPHPバージョンを選択。
5.zip化したコードをアップロード
6.「より多くのオプションの設定」をクリック
7.「ソフトウェア」、「セキュリティ」、「データベース」について設定します。
8.「ソフトウェア」ではルートとして、「index.php」が存在する「/public」を指定して保存。
9.「セキュリティ」ではEC2にssh接続するので、「EC2 キーペア」から対象のキーペアを選択して保存。このためにキーペアを準備する場合は予め作成。
10.「データベース」では対象のデータベースを選択して保存。今回は、ユーザー名「root」とパスワード「rootroot」で設定します。
11.「環境の作成」をクリック
12.構築中。今回はこの環境で12分弱かかりました。
13.構築完了。この時点で、Webサーバは動いているので、URLをクリックしてみますが、Laravelの500番のHTMLが表示されます。
.envの設定
1.ウェブサーバにssh接続します。キーペアは、さきほど、「セキュリティ」の設定時に指定したものになります。ちなみに、IPアドレスはElastic Beanstalkの中には、表示されてないように見えたので、画面をEC2に切り替えてEIPを確認する必要があるかと思います。
2.Laravelプロジェクトに入って「.env.example」をコピーして「.env」を作成します。(今回は、ある程度開発が進んだLaravelプロジェクトの前提なので、.env.exampleもデフォルトの状態ではなく、開発環境の.envのコピーということにしています。)
$ sudo cp .env.example .env
3.「.env」の中の「APP_KEY」を発行します。
$ sudo php artisan key:generate
4.「.env」の内容を修正します。
APP_NAME=test_laravel #変更なし APP_ENV=local #変更なし APP_KEY=base64:ITlWQMjXQ8q1dhlfc0NLLaAicZDPL4J8LjoTBBTtAr8= #上記コマンドで発行したキー。 APP_DEBUG=true #変更なし APP_URL=http://testlaravel-env.eba-ijmbexpp.ap-northeast-1.elasticbeanstalk.com/ #Elastic Beanstalkで表示されるルートのURL LOG_CHANNEL=stack DB_CONNECTION=mysql #環境に応じて DB_HOST=aa16b05yr6h18tk.cxboorgzneuf.ap-northeast-1.rds.amazonaws.com #今回Elastic Beanstalkで構築したRDSのエンドポイント DB_PORT=3306 #環境に応じて DB_DATABASE=test_laravel #おって、この名前でdatabaseを作成します。 DB_USERNAME=root #RDSを設定した際のユーザーネーム DB_PASSWORD=rootroot #RDSを設定した際のパスワード
RDSの設定
1.EC2からRDSに接続し、データベースを作成、またEC2に戻ってきます。
mysql -h aa16b05yr6h18tk.cxboorgzneuf.ap-northeast-1.rds.amazonaws.com -P 3306 -u root -p
MySQL [(none)]> CREATE DATABASE test_laravel; Query OK, 1 row affected (0.00 sec) MySQL [(none)]> exit
migration等
1.migration(seedもいっしょに。)
$ sudo php artisan migrate --seed
2.ここまででトップページ(ルート)は正しく表示されますが、ルート以外のページが全て404になるはずです。なので、最後に少し設定ファイルをいじります。Elastic BeanstalkではNginxがデフォルトのようなので、Nginxの設定ファイル(/etc/nginx/conf.d/elasticbeanstalk/php.conf)に下記のとおり追記します。
location ~ \.(php|phar)(/.*)?$ { fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$; fastcgi_intercept_errors on; fastcgi_index index.php; -----省略----- # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass php-fpm; } #↓この4行を追記(上記の「location」から始まる箇所は元々php.confに記載されているもので残していてOK。) location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; }
3.Nginxを再起動します。これでルート以外も正しく表示されるはずです。
$ sudo nginx -s reload
おわりに
今回、ローカルのLaravelプロジェクトをdeployしましたが、それはgitからcloneしたばかりのものなので、vendorフォルダは含まれていませんでした。ただ、上記手順でdeployしたところ、composerを使ってインストールしていないにも関わらず(というか、まだcomposerコマンドすら使えない状況です。)、サーバに上がったときには、vendorフォルダ及びその中身のパッケージ類が作成されます。composer.jsonをみてインストールしてくれているようです。