AWS Elastic Beanstalkを使ったEC2+RDS環境でのLaravelのお手軽デプロイ

2020.06.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

趣味で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をみてインストールしてくれているようです。