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コンソールを確認するとアプリケーションが追加されています。
続いて環境を作成します。
プロンプトは、ここでは、すべてデフォルトで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
eb createコマンド実行時にもプロジェクトのデプロイが実行されます。
ドキュメントによると、ローカルリポジトリの現在のブランチの最新のコミットをgit archive
でzipしてアップロードするようです。
また、初めて環境を作成した場合、Elastic Beanstalk用のロールが追加されています。
デプロイ
プロジェクトを更新したい場合は、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のデフォルトページを表示させるためには、環境変数にAPP_KEY
が必要になります。
同じく、[設定] > [ソフトウェア設定]の[環境プロパティ]に設定していきます。
.env
ファイルを開き、APP_KEYの値をコピーして貼り付けます。
[適用]をクリックします。
動作確認
環境の更新が完了したら、環境のURLにアクセスしてみます。
環境の破棄
動作確認できたら、環境を破棄しておきます。
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
環境変数の設定は、以下のようなファイルを作成します。
// .ebextensions/environmentvariables.config
option_settings:
- option_name: APP_KEY
value: XXXXXXXXXXXXXXXXXXXXXXX
ドキュメントルートを指定するphp.iniの設定は以下のようにしました。
// .ebextensions/php.ini.config
option_settings:
- namespace: aws:elasticbeanstalk:container:php:phpini
option_name: document_root
value: /public
参考: AWS Elastic Beanstalk PHP プラットフォームを使用する > 設定ファイル
設定は、eb create
やeb deploy
コマンドを実行するとデプロイされます。
$ git add .ebextensions
$ git ci -m 'Add config.'
$ eb deploy
参考
Laravel on AWS Elastic Beanstalk – Dev Guide – Go Foryt Blog
ElasticBeanstalk .ebextensions 逆引き辞典