【前編】AWS Elastic Beanstalk使い方とLaravelデプロイ

Laravel and Elastic Beanstalk deployment

Elastic Beanstalkは、EC2インスタンスなどアプリケーション開発に必要なたくさんのAWSリソースを、まとめて管理してくれるサービスになります。小さく初めてすぐにデプロイしたい、サービスが成長したときにはスケールさせられる、そういう優れたサービスだと思います。
単にWebアプリケーションのプリセットを用意しくれるだけでなく、各リソースは専用の設定ファイルを使って細かなカスタマイズが行えたり、EB CLIでCI/CDに連携できたりと便利です。
立ち上げにおいてやっぱりPaaSに比べるとやや面倒なイメージがありましたが、少し設定を学ぶことで使い勝手が良くなりましたので知見をまとめたいと思います。

目次

この記事でやること

  • EB環境を作成して、zipファイルに圧縮したLaravelプロジェクトをデプロイする
  • EBデプロイ後の環境設定をEB設定ファイルで自動化する
  • SESでメール送信できるようにする

Elastic Beanstalkの環境作成

以下のような構成を立ち上げて、開発が始められる状態を目指します。AWS公式ドキュメントを積極的に参照しながら追加で行ったことや、個人的な気づきをまとめていければと思います。

設定とデプロイ

早速、以下を参考にして最小のLaravelプロジェクトをデプロイしていきます。

補足|zipコマンド
zip ~/Downloads/laravel-default.zip -FSr * .[^.]* -x 'vendor/*' 'node_modules/*'
  • zipコマンドは出力を上書きではなく更新になり、削除したファイルが残ります。開発には不便なため-FSr で同期させます。1
  • vendor/* 以外にも本番に不要なものは除外する。例えばバンドラーを導入しているのでnode_modules/* は不要なため除きます。

ウェルカムページが表示できましたでしょうか?
ここまでとても簡単で僕は感動していました 笑。しかし、開発で繰り返しデプロイすることなどを考えると、管理しやすいとは言えないので、ここから設定を調整していきます。

設定ファイルの配置

初めにEC2インスタンス内でWebサーバーの設定をして、正しく動作することを確認します。その後にEB設定ファイルを配置していきます。
ちなみに、ここでの設定はデプロイすると消えてしまいます。

Webサーバーの設定確認

ドキュメントルート以外がアクセスできないため、Webサーバーの設定を追記しておきます。

-----省略-----
# 以下を追記します。
location / {
    try_files $uri $uri/ /index.php?$query_string;
    gzip_static on;
}

設定の読み込みを再読み込みをします。

> sudo nginx -s reload

一旦はこれで /login など、ドキュメントルート以外にアクセスできるようになったかと思います。

SQLiteを設定

ウェルカムページだけであればDBは不要です。サインアップ、ログインなど認証機能を、DBサーバーを用意せずに確認したかったため、SQLiteを利用できるようにします。

設定は簡単でファイル1つ用意するだけですぐに繋げるSQLiteはなにかと便利です。

# 接続先をsqliteに変更
DB_CONNECTION=sqlite

# 以下は削除
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

これだけで、マイグレーションを実行ができます。 database/database.sqlite ファイルが作成されており、接続するとDBが作られていることが分かります。

EB設定ファイルの配置

インスタンス内で直接設定ファイルを編集すると、デプロイ時に設定が消えてしまいます。そこで、デプロイ時に自動で設定されるようにします。Laravelプロジェクトに.ebextensions .platformというディレクトリを作り、配下に設定ファイルを配置します。

.ebextensions に複数のファイルを配置するときアルファベット順で実行されますので、先頭は数字にすることをおすすめします。

以下は設定例です。環境に応じて色々変えてみてください。

ドキュメントルートの設定

Laravelのデフォルト構成に合わせて、public配下をドキュメントルートに設定します。

option_settings:
  aws:elasticbeanstalk:container:php:phpini:
    document_root: /public
マイグレーションの実行

お好みで自動化したいコマンドを書きます。

container_commands:
   prepare_env:
      command: "mv .env.production .env"
      leader_only: true
  cache_config_clear:
      command: "php artisan config:clear"
      leader_only: true
  migration_run:
      command: "php artisan migrate --force"
      leader_only: trues
  cache_route_clear:
      command: "php artisan route:clear"
nginxの設定

Webサーバーの設定で行いましたが、これもデプロイ時に設定が読み込まれるようにします

location / {
    try_files $uri $uri/ /index.php?$query_string;
    gzip_static on;
}

EB設定ファイルの雰囲気が伝われば嬉しいです。.ebextensions の細かな仕様は以下に書かれています。

.platform はプラットフォームフックと呼ばれる機能です。OS、ランタイム、Webサーバーなどを拡張するために使われます。例えば、nginxの設定ファイルを自動で配置したりといった用途が適していると思います。詳細は以下を参照してください。

EB CLI(参考)

私は EB CLIは利用していないのですが、AWS CodeComitなどのCI/CDと連携させて、開発をされる方は導入しても良いかもしれません。
zipファイルをアップロードしてデプロイする場合は、500MBのファイル容量制限があります。こういった制限の煩わしさや、何より毎回zipファイルにまとめないといけないのは少し不便です。EB CLIを使うと、よりデプロイプロセスを自動化できます。

AWS SESの設定

今回メールサーバーは、AWS SESを利用します。

SESは初めサンドボックス環境になっているため、送信先、送信元どちらもメールアドレスの検証が必要です。

以下に従って、AWSコンソール > SES で利用するメールアドレスを追加、検証します。

環境変数を設定します。

MAIL_MAILER=ses
MAIL_HOST={SESのリージョンを指定|email-smtp.ap-northeast-1.amazonaws.com}
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS={SESで認証されたメールアドレス|sample@example.com}
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID={アクセスキー}
AWS_SECRET_ACCESS_KEY={シークレットキー}
AWS_DEFAULT_REGION=ap-northeast-1
AWS_USE_PATH_STYLE_ENDPOINT=false

最後にLaravelでメール送信できることを確認できたら完了です。

終わりに

AWS Elastic Beanstalkでドキュメントから一歩進んだ?開発環境の立ち上げについて説明しました。

開発の手始めとしてデプロイをした後に、どのように拡張していけば良いのか、設定の方法や雰囲気が伝わればと思っています。次は独自ドメイン設定、ロードバランサー、RDSを追加してシステムを公開するまでを説明します。

以上、ここまでお読みいただき、ありがとうございました。

  1. Mac OSで動作確認しています。zipコマンドのオプションはOSやバージョンにより仕様が異なる場合があります。 ↩︎
目次