最近サーバーレス(Lambda)に興味があったので始めてみるかとは思ったものの
好きな言語であるPHPは標準でサポートされておらず。。。
どうにか動かす方法はないかと調べていたところ、brefなるものを使えば簡単に動かせそう!しかもLaravelも動かせる⁉
だったので、その手順をまとめてみました。
準備
以下のものが必要になります.
- AWSアカウント
- AWS CLI
- AWSアカウントアクセスキー及びシークレットキー
- npmコマンド
こちらの準備については記事の内容ではないのでスキップします。
serverlessコマンドをインストール
まずはserverlessコマンドをインストールします。
こちらはLambdaをデプロイする際に使用します。
$ npm install -g serverless
serverlessコマンドのインストールが完了したら、AWSアクセスキー及びシークレットアクセスキーを設定します
$ serverless config credentials --provider aws --key <key> --secret <secret>
注意点として、AWS CLIのデフォルトアカウントを設定している場合は
そのアカウントが使用されるので上記の手順は不要です。
Laravelプロジェクト作成
まずはcomposerコマンドでlaravelプロジェクトを作成しましょう
$ composer create-project laravel/laravel serverless-laravel --prefer-dist
brefを追加
$ cd serverless-laravel
$ composer require bref/bref
注意点として、brefの最新バージョンを使用するにはPHP7.2以上が要求されます。
PHP7.1以下で使用したい場合はbref0.5未満を使用する必要があるみたいです(未確認)
参考: https://bref.sh/docs/installation.html#bref
serverless.ymlを用意
serverless.ymlをプロジェクトディレクトリ直下に作成します。
service: serverless-laravel
provider:
name: aws
region: ap-northeast-1
runtime: provided
environment:
# Laravel environment variables
APP_STORAGE: '/tmp'
plugins:
- ./vendor/bref/bref
functions:
website:
handler: public/index.php
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
layers:
- ${bref:layer.php-73-fpm}
events:
- http: 'ANY /'
- http: 'ANY /{proxy+}'
artisan:
handler: artisan
timeout: 120 # in seconds
layers:
- ${bref:layer.php-73} # PHP
- ${bref:layer.console} # The "console" layer
Lambda上でLaravelを動かすためにコードを変更
Lambdaでは/tmp
ディレクトリ以外への書き込みは出来ないため、Laravelが書き込みを行う領域を変える必要があります。
# $appを作成している行の直後に記載
$app->useStoragePath($_ENV['APP_STORAGE'] ?? $app->storagePath());
VIEW_COMPILED_PATH=/tmp/storage/framework/views
SESSION_DRIVER=array
LOG_CHANNEL=stderr
public function boot()
{
if (! is_dir(config('view.compiled'))) {
mkdir(config('view.compiled'), 0755, true);
}
}
デプロイ準備
デプロイを行う前に、開発用パッケージなど不要なものを削除します。
ただし、require-devでインストールした依存関係が削除されるので注意してください
$ composer install --prefer-dist --optimize-autoloader --no-dev
デプロイ
$ serverless deploy
.....
endpoints:
ANY - https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/dev
ANY - https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/dev/{proxy+}
デプロイが完了すると、コンソールにAPI GatewayのエントリーポイントのURLが表示されるのでアクセスしてみます。
デプロイしたものを削除する
removeコマンドで削除できます。
$ serverless remove