Laravel 5で作成したWeb APIのswagger.jsonをAWS API Gatewayにインポートして動作を確認するにあたって、Laravel 5 APIの動作環境はElastic Beanstalkで簡単に用意してしまいたいと思い、Laravel 5 プロジェクトをAWS Elastic Beanstalkで動作させる手順について調べてみました。

LaravelをBeanstalkにデプロイする手順については、公式ドキュメント「Elastic Beanstalk への Laravel アプリケーションのデプロイ」にも説明があります。
こちらの内容は、Zipアーカイブを作成してアップロードする手順になっています。
この記事では「Symfony2 アプリケーションを Elastic Beanstalk にデプロイする」を参考に、Gitとebコマンドを使ってデプロイする手順を確認し、その内容をまとめています。

EB CLIのインストール

Elastic Beanstalk コマンドラインインターフェイス(EB CLI)のインストールを参考にインストールします。

pipコマンドが使える環境であれば以下のコマンドでインストールできます。

$ sudo pip install awsebcli

Mac OS X El CapitanデフォルトのPython環境で、実行したところエラーが起きたので、「 OS X で EB CLI をインストールする」の説明を参考に、以下のコマンドを実行したところインストールできました。

$ sudo pip install awsebcli --ignore-installed six

プロジェクトの準備

Laravelプロジェクトを作成して、Gitの初期化をします。

$ composer create-project laravel/laravel eb-laravel
$ cd eb-laravel

次に、git initし、プロジェクトのコードをコミットします。

$ git init
$ git add .
$ git commit -m "First commit"

EB CLIの設定

プロジェクトにElastic Beanstalkの設定を追加します。

プロジェクトのディレクトリでeb initを実行します。

各プロンプトについては以下のとおり入力:

  • default regionは、東京であれば 9 を選択
  • Application Nameはデフォルトのまま (既存のアプリケーションがあれば選択オプションが表示されます)
  • 動作環境については、PHPのプロジェクトとして検出されるので y を入力
  • PHPのバージョンは、選択可能な中で最新 5.6の 3 を入力
  • SSHは不要なので n を入力
$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
(default is 3): 9

Enter Application Name
(default is "laravel-eb"):
Application laravel-eb has been created.

It appears you are using PHP. Is this correct?
(y/n): y

Select a platform version.
1) PHP 5.4
2) PHP 5.5
3) PHP 5.6
4) PHP 5.3
(default is 1): 3
Do you want to set up SSH for your instances?
(y/n): n

ここまでで、AWSコンソールを確認するとアプリケーションが追加されています。
laravel-eb-applications

続いて環境を作成します。
プロンプトは、ここでは、すべてデフォルトでEnterしておきます。

$ eb create
Enter Environment Name
(default is laravel-eb-dev): 
Enter DNS CNAME prefix
(default is laravel-eb-dev): 

2.0+ Platforms require a service role. We will attempt to create one for you. You can specify your own role using the --service-role option.
Type "view" to see the policy, or just press ENTER to continue: 
Creating application version archive "app-3bec-160630_192121".
Uploading laravel-eb/app-3bec-160630_192121.zip to S3. This may take a while.
Upload Complete.
Environment details for: laravel-eb-dev
  Application name: laravel-eb
  Region: us-east-1
  Deployed Version: app-3bec-160630_192121
  Environment ID: e-xfgxuaezmz
  Platform: 64bit Amazon Linux 2016.03 v2.1.3 running PHP 5.6
  Tier: WebServer-Standard
  CNAME: laravel-eb-dev.us-east-1.elasticbeanstalk.com
  Updated: 2016-06-30 10:21:34.891000+00:00
Printing Status:
INFO: createEnvironment is starting.
INFO: Using elasticbeanstalk-us-east-1-860587546930 as Amazon S3 storage bucket for environment data.
INFO: Environment health has transitioned to Pending. Initialization in progress (running for 7 seconds). There are no instances.
INFO: Created load balancer named: awseb-e-x-AWSEBLoa-P4V89AQ2B5IO
INFO: Created security group named: awseb-e-xfgxuaezmz-stack-AWSEBSecurityGroup-1DERFSWVRQPP2
INFO: Created Auto Scaling launch configuration named: awseb-e-xfgxuaezmz-stack-AWSEBAutoScalingLaunchConfiguration-BO9IGJXM5779
INFO: Added instance [i-26143fba] to your environment.
INFO: Created Auto Scaling group named: awseb-e-xfgxuaezmz-stack-AWSEBAutoScalingGroup-PFG96LL8AGL8
INFO: Waiting for EC2 instances to launch. This may take a few minutes.
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:us-east-1:860587546930:scalingPolicy:2476daf0-d76c-46b0-8697-096931a62ca9:autoScalingGroupName/awseb-e-xfgxuaezmz-stack-AWSEBAutoScalingGroup-PFG96LL8AGL8:policyName/awseb-e-xfgxuaezmz-stack-AWSEBAutoScalingScaleDownPolicy-53CJALOXVB9H
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:us-east-1:860587546930:scalingPolicy:9ec5c992-e86f-44d0-9830-ea2a1e34d912:autoScalingGroupName/awseb-e-xfgxuaezmz-stack-AWSEBAutoScalingGroup-PFG96LL8AGL8:policyName/awseb-e-xfgxuaezmz-stack-AWSEBAutoScalingScaleUpPolicy-1OURNJF8U1B6X
INFO: Created CloudWatch alarm named: awseb-e-xfgxuaezmz-stack-AWSEBCloudwatchAlarmLow-NP21RADXBA0N
INFO: Created CloudWatch alarm named: awseb-e-xfgxuaezmz-stack-AWSEBCloudwatchAlarmHigh-1CBRQ8R4G0G03
INFO: Successfully launched environment: laravel-eb-dev

アプリケーションに、環境が追加されました。
laravel-eb-created-environment

eb createコマンド実行時にもプロジェクトのデプロイが実行されます。
ドキュメントによると、ローカルリポジトリの現在のブランチの最新のコミットをgit archiveでzipしてアップロードするようです。

また、初めて環境を作成した場合、Elastic Beanstalk用のロールが追加されています。
laravel-eb-created-eb-roles

デプロイ

プロジェクトを更新したい場合は、Gitコミット後にeb deployコマンドを実行すると新しいコードがデプロイされます。

$ eb deploy
Creating application version archive "app-3bec-160630_192908".
Uploading laravel-eb/app-3bec-160630_192908.zip to S3. This may take a while.
Upload Complete.
INFO: Environment update is starting.                               
INFO: Deploying new version to instance(s).                         
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.                    
                                                          

環境設定

Laravelを動作させるために最小限必要な設定を環境に追加します。

ドキュメントルートの変更

デフォルトでは、プロジェクトのルートディレクトリがドキュメントルートになっていますが、Laravelの場合は/publicをドキュメントルートに指定する必要があります。
作成された環境を選択し、[設定] > [ソフトウェア設定]を開きます。
[ドキュメントのルート]に/publicと入力して[適用]をクリックします。
laravel-eb-set-document-root

環境変数の設定

Laravelのデフォルトページを表示させるためには、環境変数にAPP_KEYが必要になります。

同じく、[設定] > [ソフトウェア設定]の[環境プロパティ]に設定していきます。
.envファイルを開き、APP_KEYの値をコピーして貼り付けます。
laravel-eb-set-environment-app-key
[適用]をクリックします。

動作確認

環境の更新が完了したら、環境のURLにアクセスしてみます。

laravel-eb-show-default-index-page

環境の破棄

動作確認できたら、環境を破棄しておきます。
eb terminateコマンドを利用します。

$ eb terminate
The environment "laravel-eb-dev" and all associated instances will be terminated.
To confirm, type the environment name: laravel-eb-dev
INFO: terminateEnvironment is starting.
INFO: Deleted CloudWatch alarm named: awseb-e-3uqukmykjm-stack-AWSEBCloudwatchAlarmHigh-67RUXO14QO29 
INFO: Deleted CloudWatch alarm named: awseb-e-3uqukmykjm-stack-AWSEBCloudwatchAlarmLow-QV6H17GRQPMC 
INFO: Deleted Auto Scaling group policy named: arn:aws:autoscaling:us-east-1:860587546930:scalingPolicy:55836b13-1f90-43a6-832f-9889c6af45dc:autoScalingGroupName/awseb-e-3uqukmykjm-stack-AWSEBAutoScalingGroup-YW214DDTOCEF:policyName/awseb-e-3uqukmykjm-stack-AWSEBAutoScalingScaleUpPolicy-957ZKLWR5N6A
INFO: Deleted Auto Scaling group policy named: arn:aws:autoscaling:us-east-1:860587546930:scalingPolicy:0a3b2573-78ff-45e6-baf0-9b26c7ddb0a7:autoScalingGroupName/awseb-e-3uqukmykjm-stack-AWSEBAutoScalingGroup-YW214DDTOCEF:policyName/awseb-e-3uqukmykjm-stack-AWSEBAutoScalingScaleDownPolicy-1WJEZDIWYAOZ5
INFO: Waiting for EC2 instances to terminate. This may take a few minutes.
INFO: Environment health has transitioned from Ok to Info. Terminate in progress (running for 22 seconds).
WARN: Environment health has transitioned from Info to Severe. Terminate in progress (running for 81 seconds). ELB health is failing or not available for all instances.
INFO: Removed instance [i-32f360b4] from your environment.
INFO: Deleted Auto Scaling group named: awseb-e-3uqukmykjm-stack-AWSEBAutoScalingGroup-YW214DDTOCEF
INFO: Deleted Auto Scaling launch configuration named: awseb-e-3uqukmykjm-stack-AWSEBAutoScalingLaunchConfiguration-GCP7RKRBAYME
INFO: Deleted security group named: awseb-e-3uqukmykjm-stack-AWSEBSecurityGroup-1FIZRTMPNHN01
INFO: Deleted load balancer named: awseb-e-3-AWSEBLoa-Y1NRMDU34NBP
INFO: Deleting SNS topic for environment laravel-eb-dev.
INFO: terminateEnvironment completed successfully.
                                

この後やること

通常は、この後RDSにDBを作成してプロジェクトに設定していきますが、そちらは公式ドキュメントに説明を参考にしてください。
(RDSも含めてちゃんと運用環境を構築するとなるとOpsWorksを検討した方が良さそうです)

次は、Laravel 5のSwagger定義ファイルをAWS API Gatewayインポートして、API Gatewayを介してBeanstalkアプリケーションにアクセスする手順をまとめたいと思います。

補足: 設定ファイル

上記では、ドキュメントルートおよび環境変数APP_KEYの設定をマネジメントコンソールで行いましたが、設定ファイルも利用できます。

EB CLIを利用する場合、設定はプロジェクト直下の.ebextensionsディレクトリ内の*.configファイルが読み込まれます。
参考: 環境の作成時の設定オプションの設定 > EB CLI を使用する

ディレクトリを作成します。

$ mkdir .ebextensions

環境変数の設定は、以下のようなファイルを作成します。

option_settings:
  - option_name: APP_KEY
    value: XXXXXXXXXXXXXXXXXXXXXXX

ドキュメントルートを指定するphp.iniの設定は以下のようにしました。

option_settings:
  - namespace: aws:elasticbeanstalk:container:php:phpini
    option_name: document_root
    value: /public

参考: AWS Elastic Beanstalk PHP プラットフォームを使用する > 設定ファイル

設定は、eb createeb deployコマンドを実行するとデプロイされます。

$ git add .ebextensions
$ git ci -m 'Add config.'
$ eb deploy

参考

Laravel on AWS Elastic Beanstalk – Dev Guide – Go Foryt Blog
ElasticBeanstalk .ebextensions 逆引き辞典