BLOG

ブログ

Brefを使用してAWS LambdaでLaravelアプリケーションを実行する

はじめに

今回は、サーバーレスなLaravel環境の構築方法についてご紹介します。

簡単に言うと、LaravelアプリケーションをAWS Lambda上にデプロイすることで実現するのですが、実際のところ、PHP(Laravel)はAWS Lambdaのランタイムサポート対象外なので、直接利用することはできません。

Laravel公式では、Laravel Vaporというサーバーレス環境構築ツールを提供していますが、今回はBrefServerless 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を利用することで、簡単に構築することができますので、ぜひ試してみてください!

RELATED ARTICLE