AWS にサーバレスな Laravel をデプロイする

はじめに

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" がアプリ名になるので、必要なら好きなのに変える

途中でパーミッション変更のために PC のパスワードを要求されるので入力する

インストールが終わったらコンテナを起動する

起動したら http://localhost/ にアクセスして Laravel の初期画面が表示されたら環境構築は終わり

laravel

コンテナを停止するときは

だけど、今後は sail コマンドを使って Laravel が動いているコンテナ laravel.test でいろいろな処理を実行するので、コンテナは動かしたままにしておく

AWS アカウントを作成する

当然ながら AWS のアカウントが必要なので、なければ作成する

アカウント作成には支払い情報(クレジットカード)が必要になるけれど、無料枠で十分利用できるはず(たぶん)

IAMユーザを作成する

AWS コンソール上部の検索フォームに「IAM」と入力して IAM のコンソールにアクセスする

サイドメニューから「ユーザ」をクリック → 「ユーザを追加」をクリックする

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

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

以降はデフォルトのまま「ユーザの作成」をクリックして完了するまで進める

アクセスキーとシークレットが発行されるのでダウンロードしておく

Serverless Frameworkをインストールする

Serverless Framework は AWS Lambda へのデプロイをサポートしてくれる

完了したらターミナルを再起動して serverless -v でインストールを確認する

Serverless Framework に AWS の認証情報を設定する

IAM ユーザを作成したときにダウンロードしたアクセスキーとシークレットを設定する

既に別の設定がされている場合はエラーになるので、-o オプションを付与して上書きする

brefとbref/laravel-bridgeをインストールする

bref は、PHP を扱えない AWS Lambda で PHP を扱えるようにしてくれる

serverless-config を生成する

以下のコマンドで、デプロイする AWS の環境を設定する serverless.yml を生成してくれる

生成された serverless.yml に下記の修正を行う

  • リージョンを変更する

  • PHP のバージョンを 8.0 から 8.1 に変更する(2箇所)

    vender/composer/platform_check.php で PHP8.1 以降に制限されているので、PHP8.0 だとデプロイ先で InternalServerError になる

AWSへデプロイする

下記のコマンドで AWS へデプロイする

デプロイが完了すると API Gateway のエンドポイントがログに出る

エンドポイントにブラウザでアクセスして Laravel の初期画面が表示されたらOK

AWS のコンソールで Lambda と API Gateway になにかできていることも確認できるはず

また、試しに resources/views/welcome.blade.phptitle タグを編集してから再度デプロイすると、変更が反映されることも確認できると思う

後始末

デプロイしたものは serverless remove で AWS から削除する

ローカルのコンテナも停止する

おわりに

今回デプロイしたのは ここ の図の API Gateway と Lambda だけで、データベースすらない環境なのでこのままでは使えないが、最初の取っ掛かりにはなると思う