目次
はじめに
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" がアプリ名になるので、必要なら好きなのに変える
1 |
curl -s https://laravel.build/sample-app | bash |
途中でパーミッション変更のために PC のパスワードを要求されるので入力する
1 2 3 |
Please provide your password so we can make some final adjustments to your application's permissions. Password: |
インストールが終わったらコンテナを起動する
1 2 |
cd sample-app ./vendor/bin/sail up -d |
起動したら http://localhost/ にアクセスして Laravel の初期画面が表示されたら環境構築は終わり
コンテナを停止するときは
1 |
./vendor/bin/sail down |
だけど、今後は sail
コマンドを使って Laravel が動いているコンテナ laravel.test
でいろいろな処理を実行するので、コンテナは動かしたままにしておく
AWS アカウントを作成する
当然ながら AWS のアカウントが必要なので、なければ作成する
アカウント作成には支払い情報(クレジットカード)が必要になるけれど、無料枠で十分利用できるはず(たぶん)
IAMユーザを作成する
AWS コンソール上部の検索フォームに「IAM」と入力して IAM のコンソールにアクセスする
サイドメニューから「ユーザ」をクリック → 「ユーザを追加」をクリックする
ユーザー名を適当に設定し、「アクセスキー_プログラムによるアクセス」にチェックを入れて、「次のステップ:アクセス権限」をクリックする
「既存のポリシーを直接アタッチ」を選択し、ポリシー「AdministratorAccess」にチェックを入れて「次のステップ:タグ」をクリックする( 「AdministratorAccess」はフルアクセスの許可なので、本来はアクセスを制限すべき)
以降はデフォルトのまま「ユーザの作成」をクリックして完了するまで進める
アクセスキーとシークレットが発行されるのでダウンロードしておく
Serverless Frameworkをインストールする
Serverless Framework は AWS Lambda へのデプロイをサポートしてくれる
1 |
curl -o- -L https://slss.io/install | bash |
完了したらターミナルを再起動して serverless -v
でインストールを確認する
1 2 3 4 |
% serverless -v Framework Core: 3.25.1 (standalone) Plugin: 6.2.2 SDK: 4.3.2 |
Serverless Framework に AWS の認証情報を設定する
IAM ユーザを作成したときにダウンロードしたアクセスキーとシークレットを設定する
1 |
serverless config credentials --provider aws --key {key} --secret {secret} |
既に別の設定がされている場合はエラーになるので、-o
オプションを付与して上書きする
brefとbref/laravel-bridgeをインストールする
bref は、PHP を扱えない AWS Lambda で PHP を扱えるようにしてくれる
1 |
./vendor/bin/sail composer require bref/bref bref/laravel-bridge |
serverless-config を生成する
以下のコマンドで、デプロイする AWS の環境を設定する serverless.yml
を生成してくれる
1 |
./vendor/bin/sail artisan vendor:publish --tag=serverless-config |
生成された serverless.yml
に下記の修正を行う
-
リージョンを変更する
1region: ap-northeast-1 # アジアパシフィック (東京) -
PHP のバージョンを 8.0 から 8.1 に変更する(2箇所)
12layers:- ${bref:layer.php-81-fpm}12layers:- ${bref:layer.php-81} # PHPvender/composer/platform_check.php で PHP8.1 以降に制限されているので、PHP8.0 だとデプロイ先で InternalServerError になる
AWSへデプロイする
下記のコマンドで AWS へデプロイする
1 |
serverless deploy |
デプロイが完了すると API Gateway のエンドポイントがログに出る
1 2 3 4 |
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 から削除する
1 |
serverless remove |
ローカルのコンテナも停止する
1 |
./vendor/bin/sail down |
おわりに
今回デプロイしたのは ここ の図の API Gateway と Lambda だけで、データベースすらない環境なのでこのままでは使えないが、最初の取っ掛かりにはなると思う