目次
はじめに
AWS Lambda は、サーバーレスでイベント駆動型のコンピューティングサービス
Lambda は PHP をサポートしていないのだけれど、 bref を使うことで Lambda で Laravel を動かせるという
とりあえず試して動かせたので、手順をメモっておく
環境
- MacOS(13.0.1)
- Docker Desktop(4.12.0)
手順
Sail で Laravel の開発環境を用意する
Laravel Sail(セイル、帆、帆船)は、LaravelのデフォルトのDocker開発環境を操作するための軽量コマンドラインインターフェイスです。
https://readouble.com/laravel/9.x/ja/sail.html
以下のコマンドで Laravel をインストールする
"sample-app" がアプリ名になるので、必要なら好きなのに変える
curl -s https://laravel.build/sample-app | bash
途中でパーミッション変更のために PC のパスワードを要求されるので入力する
Please provide your password so we can make some final adjustments to your application's permissions.
Password:
インストールが終わったらコンテナを起動する
cd sample-app
./vendor/bin/sail up -d
起動したら http://localhost/ にアクセスして Laravel の初期画面が表示されたら環境構築は終わり

コンテナを停止するときは
./vendor/bin/sail down
だけど、今後は sail コマンドを使って Laravel が動いているコンテナ laravel.test でいろいろな処理を実行するので、コンテナは動かしたままにしておく
AWS アカウントを作成する
当然ながら AWS のアカウントが必要なので、なければ作成する
アカウント作成には支払い情報(クレジットカード)が必要になるけれど、無料枠で十分利用できるはず(たぶん)
IAMユーザを作成する
AWS コンソール上部の検索フォームに「IAM」と入力して IAM のコンソールにアクセスする
サイドメニューから「ユーザ」をクリック → 「ユーザを追加」をクリックする

ユーザー名を適当に設定し、「アクセスキー_プログラムによるアクセス」にチェックを入れて、「次のステップ:アクセス権限」をクリックする

「既存のポリシーを直接アタッチ」を選択し、ポリシー「AdministratorAccess」にチェックを入れて「次のステップ:タグ」をクリックする( 「AdministratorAccess」はフルアクセスの許可なので、本来はアクセスを制限すべき)

以降はデフォルトのまま「ユーザの作成」をクリックして完了するまで進める
アクセスキーとシークレットが発行されるのでダウンロードしておく
Serverless Frameworkをインストールする
Serverless Framework は AWS Lambda へのデプロイをサポートしてくれる
curl -o- -L https://slss.io/install | bash
完了したらターミナルを再起動して serverless -v でインストールを確認する
% serverless -v
Framework Core: 3.25.1 (standalone)
Plugin: 6.2.2
SDK: 4.3.2
Serverless Framework に AWS の認証情報を設定する
IAM ユーザを作成したときにダウンロードしたアクセスキーとシークレットを設定する
serverless config credentials --provider aws --key {key} --secret {secret}
既に別の設定がされている場合はエラーになるので、-o オプションを付与して上書きする
brefとbref/laravel-bridgeをインストールする
bref は、PHP を扱えない AWS Lambda で PHP を扱えるようにしてくれる
./vendor/bin/sail composer require bref/bref bref/laravel-bridge
serverless-config を生成する
以下のコマンドで、デプロイする AWS の環境を設定する serverless.yml を生成してくれる
./vendor/bin/sail artisan vendor:publish --tag=serverless-config
生成された serverless.yml に下記の修正を行う
-
リージョンを変更する
region: ap-northeast-1 # アジアパシフィック (東京) -
PHP のバージョンを 8.0 から 8.1 に変更する(2箇所)
layers: - ${bref:layer.php-81-fpm}layers: - ${bref:layer.php-81} # PHPvender/composer/platform_check.php で PHP8.1 以降に制限されているので、PHP8.0 だとデプロイ先で InternalServerError になる
AWSへデプロイする
下記のコマンドで AWS へデプロイする
serverless deploy
デプロイが完了すると API Gateway のエンドポイントがログに出る
endpoint: ANY - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com
functions:
web: laravel-dev-web (30 MB)
artisan: laravel-dev-artisan (30 MB)
エンドポイントにブラウザでアクセスして Laravel の初期画面が表示されたらOK

AWS のコンソールで Lambda と API Gateway になにかできていることも確認できるはず
また、試しに resources/views/welcome.blade.php で title タグを編集してから再度デプロイすると、変更が反映されることも確認できると思う
後始末
デプロイしたものは serverless remove で AWS から削除する
serverless remove
ローカルのコンテナも停止する
./vendor/bin/sail down
おわりに
今回デプロイしたのは ここ の図の API Gateway と Lambda だけで、データベースすらない環境なのでこのままでは使えないが、最初の取っ掛かりにはなると思う

