Brefを使用してAWS LambdaでLaravelアプリケーションを実行する
はじめに
今回は、サーバーレスなLaravel環境の構築方法についてご紹介します。
簡単に言うと、LaravelアプリケーションをAWS Lambda上にデプロイすることで実現するのですが、実際のところ、PHP(Laravel)はAWS Lambdaのランタイムサポート対象外なので、直接利用することはできません。
Laravel公式では、Laravel Vaporというサーバーレス環境構築ツールを提供していますが、今回はBrefとServerless Frameworkを利用して、PHPのカスタムランタイム環境を構築してみることにします。
動作環境
- PHP: 8.1
- Laravel: 10.11.0
- Bref: 2.0
- Serverless Framework: 3.31.0
- npm: 7.21.0
前提
AWSアカウントの作成と設定
IAMユーザーを作成して、アクセスキーとシークレットキーを発行しておきます。
IAMユーザー名 | laravel-app |
許可ポリシー | AdministratorAccess |
SailでLaravelプロジェクトを作成
作成方法はこちらの記事を参照してください。
手順
1. Serverless Frameworkをインストールする
Serverless Frameworkとは、サーバーレスなアプリケーションを簡単に開発、デプロイするためのNode.js製のフレームワークです。
AWS、Azure、GCPなど、様々なクラウドサービスで利用することができます。
% npm install -g serverless
npm経由でのインストールが推奨されていますが、提供されているセットアップスクリプトからもインストールすることができます。
% curl -o- -L https://slss.io/install | bash
インストールが完了したら、ターミナルを再起動してインストールが正常に行われたことを確認します。
% serverless -v
Framework Core: 3.31.0 (local)
Plugin: 6.2.3
SDK: 4.3.2
2. Serverless FrameworkにAWS認証情報を設定する
IAMユーザーのアクセスキーとシークレットキーを設定します。
% serverless config credentials --provider aws --key <key> --secret <secret>
※既に設定済みの場合はエラーになるので、-oオプションを付与して上書きすることができます。
3. Brefをインストールする
Brefとは、LaravelアプリケーションをAWS Lambdaで実行するためのツールです。
LaravelアプリケーションをBrefとLaravel-Brefパッケージで拡張することで、Lambda関数としてデプロイすることができます。
% sail composer require bref/bref bref/laravel-bridge --update-with-dependencies
4. serverless.ymlを作成する
サーバーレスアプリケーション用の構成ファイルserverless.ymlを作成します。
% sail artisan vendor:publish --tag=serverless-config
service: laravel
provider:
name: aws
# The AWS region in which to deploy (us-east-1 is the default)
region: us-east-1
# Environment variables
environment:
APP_ENV: production # Or use ${sls:stage} if you want the environment to match the stage
package:
# Files and directories to exclude from deployment
patterns:
- '!node_modules/**'
- '!public/storage'
- '!resources/assets/**'
- '!storage/**'
- '!tests/**'
functions:
# This function runs the Laravel website/API
web:
handler: public/index.php
runtime: php-81-fpm
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
events:
- httpApi: '*'
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
runtime: php-81-console
timeout: 720 # in seconds
# Uncomment to also run the scheduler every minute
#events:
# - schedule:
# rate: rate(1 minute)
# input: '"schedule:run"'
plugins:
# We need to include the Bref plugin
- ./vendor/bref/bref
デフォルトはバージニア北部(us-east-1)リージョンなので、必要に応じて変更してください。
provider:
name: aws
# The AWS region in which to deploy (us-east-1 is the default)
# region: us-east-1
region: ap-northeast-1
5. LaravelアプリケーションをLambdaにデプロイ
デプロイする前にLaravelのキャッシュを削除しておきます。
% sail artisan config:clear
AWSにデプロイします。これでLambdaとAPI Gatewayが自動で構築されます。
% serverless deploy
デプロイが完了、アプリケーションのURLが表示されます。
endpoint: ANY - https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com
functions:
web: laravel-dev-web (32 MB)
artisan: laravel-dev-artisan (32 MB)
URLにアクセスすると、Laravelのサンプルページが表示されました!
serverless.ymlにartisan関数が定義されているので、AWS Lambda上でArtisanコマンドを実行することもできます。
% serverless bref:cli --args="--version"
{
"exitCode": 0,
"output": "Laravel Framework 10.11.0\n"
}
最後に、デプロイしたサービスを削除します。
% serverless remove
おわりに
以上、サーバーレスなLaravel環境の構築方法についてご紹介しました。
サーバーレスの利点として、サーバーの運用が不要であり、自動スケーリングや従量課金によるコスト削減が可能です。
また、AWS Lambda上でLaravelを利用することで、JavaScriptやPythonのランタイムでゼロからコーディングするよりも、効率的にコードを書くことができます。
BrefとServerless Frameworkを利用することで、簡単に構築することができますので、ぜひ試してみてください!