Elastic Beanstalk への Laravel アプリケーションのデプロイ - AWS Elastic Beanstalk

Elastic Beanstalk への Laravel アプリケーションのデプロイ

Laravel は PHP 用のオープンソースのモデルビューコントローラー(MVC)フレームワークです。このチュートリアルでは、Laravel のアプリケーションを生成し、AWS Elastic Beanstalk 環境にデプロイし、Amazon Relational Database Service (Amazon RDS) データベースインスタンスに接続するように設定するプロセスについて説明します。

前提条件

このチュートリアルでは、基本的な Elastic Beanstalk オペレーションと Elastic Beanstalk コンソールに関する知識があることを前提としています。まだ起動していない場合は、Elastic Beanstalk を使用して開始するの指示に従って、最初の Elastic Beanstalk 環境を起動します。

このガイドの手順に従うには、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。

~/eb-project$ this is a command this is output

Linux および macOS では、任意のシェルとパッケージマネージャーを使用できます。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

Laravel 6 では PHP 7.2 以降が必要です。また、Laravel 公式ドキュメントのサーバー要件のトピックに記載されている PHP 拡張も必要です。トピックPHP 開発環境のセットアップの指示に従って、PHP と Composer をインストールします。

Laravel のサポートおよびメンテナンス情報については、Laravel 公式ドキュメントのサポートポリシーのトピックをご参照ください。

Elastic Beanstalk 環境の起動

Elastic Beanstalk コンソールを使用して、Elastic Beanstalk 環境を作成します。[PHP] プラットフォームを選択し、デフォルト設定およびサンプルコードを受け入れます。

環境を起動するには(コンソール)

  1. 事前に設定されたリンク (console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced) を使用して、Elastic Beanstalk コンソールを開きます。

  2. [プラットフォーム] で、アプリケーションで使用される言語に一致するプラットフォームとプラットフォームブランチを選択します。

  3. アプリケーションコード として、サンプルアプリケーション を選択します。

  4. 確認と起動 を選択します。

  5. 使用できるオプションを確認します。使用する有効なオプションを選択し、準備ができたら [アプリの作成] を選択します。

環境の作成の所要時間は約 5 分です。以下のリソースが作成されます。

  • EC2 インスタンス – 選択したプラットフォームでウェブアプリケーションを実行するよう設定された Amazon Elastic Compute Cloud (Amazon EC2) 仮想マシン。

    各プラットフォームは、それぞれ特定の言語バージョン、フレームワーク、ウェブコンテナ、またはそれらの組み合わせをサポートするための、特定のソフトウェア、設定ファイル、スクリプトを実行します。ほとんどのプラットフォームでは、Apache または NGINX のいずれかをウェブアプリケーションの前にリバースプロキシとして配置します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供し、アクセスログとエラーログを生成します。

  • インスタンスセキュリティグループ – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、ロードバランサーからの HTTP トラフィックが、ウェブアプリケーションを実行している EC2 インスタンスに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。

  • ロードバランサー – アプリケーションを実行するインスタンスにリクエストを分散するよう設定された Elastic Load Balancing ロードバランサー。ロードバランサーにより、インスタンスを直接インターネットに公開する必要もなくなります。

  • ロードバランサーセキュリティグループ – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、インターネットからの HTTP トラフィックが、ロードバランサーに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。

  • Auto Scaling グループ – インスタンスが終了されたか利用不可になった場合にそのインスタンスを置き換えるよう設定された Auto Scaling グループ。

  • Amazon S3 バケット – Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所。

  • Amazon CloudWatch アラーム – 環境内のインスタンスの負荷をモニタリングする 2 つの CloudWatch アラーム。負荷が高すぎる、または低すぎる場合にトリガーされます。アラームがトリガーされると、Auto Scaling グループはレスポンスとしてスケールアップまたはダウンを行います。

  • AWS CloudFormation スタック – 環境内でリソースを起動して、設定の変更を伝達するために、Elastic Beanstalk は AWS CloudFormation を使用します。リソースは、 AWS CloudFormationコンソールに表示できるテンプレートで定義されます。

  • ドメイン名 – ウェブアプリケーションまでのルートとなるドメイン名であり、subdomain.region.elasticbeanstalk.com の形式です。

これらのリソースはすべて Elastic Beanstalk によって管理されます。環境を終了すると、Elastic Beanstalk は含まれているすべてのリソースを終了します。

注記

Elastic Beanstalk が作成する Amazon S3 バケットは、環境間で共有され、環境の終了時に削除されません。詳細については、「Amazon S3 で Elastic Beanstalk を使用する」を参照してください。

Laravel をインストールしてウェブサイトを生成する

以下の 1 つのコマンドで、Composer は Laravel をインストールして作業プロジェクトを作成できます。

~$ composer create-project --prefer-dist laravel/laravel eb-laravel

Composer は Laravel とその依存関係をインストールし、デフォルトのプロジェクトを生成します。

Laravel のインストール中に問題が発生した場合は、公式ドキュメント (https://laravel.com/docs/6.x) のインストールに関するトピックをご参照ください。

アプリケーションをデプロイする

Composer で作成されたファイルを含むソースバンドルを作成します。次のコマンドでは、laravel-default.zip というソースバンドルが作成されます。vendor フォルダ内のファイルは除外されます。これらのファイルは、多くのスペースを使用するだけでなく、アプリケーションを Elastic Beanstalk にデプロイするのに不要です。

~/eb-laravel$ zip ../laravel-default.zip -r * .[^.]* -x "vendor/*"

ソースバンドルを Elastic Beanstalk にアップロードし、Laravel を環境にデプロイします。

ソースバンドルをデプロイするには

  1. Elastic Beanstalk コンソールを開き、[リージョン] リストで AWS リージョンを選択します。

  2. ナビゲーションペインで、[環境] を選択し、リストから環境の名前を選択します。

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

  3. 環境の概要ページで、[Upload and deploy (アップロードとデプロイ)] を選択します。

  4. 画面上のダイアログボックスを使用して、ソースバンドルをアップロードします。

  5. [Deploy] を選択します。

  6. デプロイが完了したら、新しいタブのウェブサイトを開く、サイトの URL を選択できます。

注記

さらにソースバンドルを最適化するには、Git リポジトリを初期化し、git archive コマンドを使用してソースバンドルを作成します。デフォルトの Laravel プロジェクトには、.gitignore ファイルが含まれています。このファイルは、デプロイに不要な vendor フォルダと他のファイルを除外するよう Git に指示します。

Composer 設定の設定

デプロイが完了したら、URL をクリックして Laravel アプリケーションをブラウザで開きます。

説明 デフォルトでは、Elastic Beanstalk によってウェブサイトのルートパスにプロジェクトのルートが提供されています。この場合、デフォルトのページ(index.php)は public フォルダーの 1 レベル下にあります。URL に /public を追加することでこれを確認できます。たとえば、http://laravel.us-east-2.elasticbeanstalk.com/public と指定します。

ルートパスで Laravel アプリケーションをサポートするには、Elastic Beanstalk コンソールを使用してウェブサイトのドキュメントルートを設定します。

ウェブサイトのドキュメントルートを設定するには

  1. Elastic Beanstalk コンソールを開き、[リージョン] リストで AWS リージョンを選択します。

  2. ナビゲーションペインで、[環境] を選択し、リストから環境の名前を選択します。

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

  3. ナビゲーションペインで、[設定] を選択します。

  4. [ソフトウェア] 設定カテゴリで、[編集] を選択します。

  5. [ドキュメントのルート] に「/public」と入力します。

  6. [Apply] を選択します。

  7. 更新が完了したら、ブラウザーでサイトを再び開くための URL をクリックします。

ここまで完了したら、次は、お客様の環境にデータベースを追加し、そのデータベースに接続するように Laravel を設定します。

お客様の環境にデータベースを追加する

Elastic Beanstalk 環境で RDS DB インスタンスを起動します。Elastic Beanstalk 上の Laravel では、MySQL、SQLServer、または PostgreSQL データベースを使用できます。この例では、MySQL を使用します。

注記

Elastic Beanstalk 環境で Amazon RDS インスタンスを実行するのは、開発とテストには最適ですが、データベースのライフサイクルがお客様の環境に結び付けられます。お客様の環境の外で実行されているデータベースに接続する手順については、「デフォルトの VPC で外部 Amazon RDS インスタンスを起動して接続」を参照してください。

RDS DB インスタンスを Elastic Beanstalk 環境に追加するには

  1. Elastic Beanstalk コンソールを開き、[リージョン] リストで AWS リージョンを選択します。

  2. ナビゲーションペインで、[環境] を選択し、リストから環境の名前を選択します。

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

  3. ナビゲーションペインで、[設定] を選択します。

  4. [データベース] 設定カテゴリで、[編集] を選択します。

  5. [エンジン] で、[mysql] を選択します。

  6. マスターの [username] と [password] に入力します。Elastic Beanstalk は環境プロパティを使用して、アプリケーションにこれらの値を渡します。

  7. [Apply] を選択します。

データベースインスタンスの作成には約 10 分かかります。その間に、環境から接続情報を読み取るようにソースコードを更新できます。Elastic Beanstalk は、RDS_HOSTNAME などの環境変数を使用して、接続の詳細をアプリケーションに渡します。

Laravel のデータベース設定は、プロジェクトコードで database.php フォルダ内の config という名前のファイルに保存されています。mysql エントリを見つけ、hostdatabaseusernameand password の各変数を変更して Elastic Beanstalk から対応する値を読み取ります。

例 ~/Eb-laravel/config/database.php

... 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('RDS_HOSTNAME', '127.0.0.1'), 'port' => env('RDS_PORT', '3306'), 'database' => env('RDS_DB_NAME', 'forge'), 'username' => env('RDS_USERNAME', 'forge'), 'password' => env('RDS_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ...

データベース接続が正しく設定されていることを確認するには、データベースに接続してデフォルトのレスポンスを返すコードを index.php に追加します。

例 ~/Eb-laravel/public/index.php

... if(DB::connection()->getDatabaseName()) { echo "Connected to database ".DB::connection()->getDatabaseName(); } $response->send(); ...

DB インスタンスの起動が完了したら、更新したアプリケーションのバンドルを作成し、お客様の環境にデプロイします。

Elastic Beanstalk 環境を更新するには

  1. 新しいソースバンドルを作成します。

    ~/eb-laravel$ zip ../laravel-v2-rds.zip -r * .[^.]* -x "vendor/*"
  2. Elastic Beanstalk コンソールを開き、[リージョン] リストで AWS リージョンを選択します。

  3. ナビゲーションペインで、[環境] を選択し、リストから環境の名前を選択します。

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

  4. [Upload and Deploy] を選択します。

  5. [Browse] を選択して laravel-v2-rds.zip をアップロードします。

  6. [Deploy] を選択します。

アプリケーションの新しいバージョンのデプロイには 1 分以上かかりません。デプロイが完了したら、ウェブページを更新して、データベースに接続されたことを確認します。

クリーンアップ

Elastic Beanstalk での作業が終了したら、環境を終了できます。Elastic Beanstalk は、Amazon EC2 インスタンスデータベースインスタンスロードバランサー、セキュリティグループ、アラームなど、お客様の環境に関連付けられているすべての AWS リソースを終了します。

Elastic Beanstalk 環境を終了するには

  1. Elastic Beanstalk コンソールを開き、[リージョン] リストで AWS リージョンを選択します。

  2. ナビゲーションペインで、[環境] を選択し、リストから環境の名前を選択します。

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

  3. [環境アクション] を選択してから、[環境の終了] を選択します。

  4. 画面上のダイアログボックスを使用して、環境の終了を確認します。

Elastic Beanstalk を使用すると、いつでもアプリケーション用の新しい環境を簡単に作成できます。

さらに、Elastic Beanstalk 環境の外に作成したデータベースリソースを終了できます。Amazon RDS DB インスタンスを終了する場合、スナップショットを作成し、後で別のインスタンスにデータを復元できます。

RDS DB インスタンスを終了するには

  1. Amazon RDS コンソールを開きます。

  2. [データベース] を選択します。

  3. DB インスタンスを選択します。

  4. [ Actions] を選択して、[Delete] を選択します。

  5. スナップショットを作成するかどうかを選択してから、削除 を選択します。

次のステップ

Laravel の詳細については、Laravel 公式ウェブサイト (laravel.com) をご覧ください。

アプリケーションの開発が進むにつれ、.zip ファイルを手動で作成して Elastic Beanstalk コンソールにアップロードすることなく、環境を管理してアプリケーションをデプロイする方法が必要になります。Elastic Beanstalk コマンドラインインターフェイス (EB CLI) には、コマンドラインインターフェイスからアプリケーションを作成、設定して、Elastic Beanstalk 環境にデプロイするための使いやすいコマンドが用意されています。

このチュートリアルでは、Elastic Beanstalk コンソールを使用して Composer のオプションを設定しました。この設定をアプリケーションソースの一部にするには、次のような設定ファイルを使用できます。

例 .ebextensions/composer.config

option_settings: aws:elasticbeanstalk:container:php:phpini: document_root: /public

詳細については、「設定ファイル (.ebextensions) による高度な環境のカスタマイズ」を参照してください。

Elastic Beanstalk 環境で Amazon RDS DB インスタンスを実行するのは、開発とテストには最適ですが、データベースのライフサイクルがお客様の環境に結び付けられます。お客様の環境の外で実行されているデータベースに接続する手順については、「PHP アプリケーション環境に Amazon RDS DB インスタンスを追加」を参照してください。

最後に、本稼働環境でアプリケーションを使用する予定の場合は、お客様の環境にカスタムドメイン名を設定し、セキュアな接続のために HTTPS を有効にすることが必要になります。