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

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 の初期画面が表示されたら環境構築は終わり

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} # PHP

    vender/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.phptitle タグを編集してから再度デプロイすると、変更が反映されることも確認できると思う

後始末

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

serverless remove

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

./vendor/bin/sail down

おわりに

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