Laravel開発者のためのAWSサーバレス環境入門 - Vaporを使った実践ガイド

Laravel開発者のためのAWSサーバレス環境入門 - Vaporを使った実践ガイド

Clock Icon2025.03.31

はじめに

Laravel Vaporは、AWS Lambdaを基盤としてPHPフレームワークのLaravelを動作させるためのサーバレスデプロイプラットフォームです。Laravel Vaporを使うことで、サーバの管理やスケーリングについて意識することなく、Laravelアプリケーションをデプロイすることができます。

現時点では、Laravel Vaporはサンドボックスとして1プロジェクトのみ無料で利用することができます。試しに使ってみました。

アプリケーションをAWSにデプロイする際の課題

Laravelに限ったことではなく、アプリケーションをAWSにデプロイする際にはいくつか考えるべき課題があります。

  • サーバの管理
  • スケーリング
  • パフォーマンス
  • セキュリティ

AWSでは、これらの課題を解決するためのサービスが提供されていますが、それらを利用するためにはAWSの知識が必要です。

例えば、サーバの管理工数を削減するためには、ECS on FargateやLambdaなどのサーバーレスサービスを利用することが考えられます。スケーリングであれば、Auto ScalingやElastic Load Balancingなどを利用することが考えられます。パフォーマンスにおいては、CloudFrontやS3などのサービスを利用することが考えられます。セキュリティにおいては、IAMやVPCなどのサービスを利用することが考えられます。

これらの課題は、AWSでアプリケーションをデプロイする際の一般的な課題となることがあります。Laravel Vaporは、これらの課題を解決するためのプラットフォームです。

AWSアカウントとの連携

早速、Laravel Vaporを使ってみましょう。まずは、AWSアカウントとの連携を行います。

Laravel Vaporアカウントの登録(https://vapor.laravel.com)が完了したら、AWS側でIAMロールの作成を始めます。これは、Laravel VaporがAWSリソースにアクセスするために必要となるものです。

Laravel Vaporのダッシュボードから以下のようにVaporのAWSアカウントIDと外部IDを確認できますので、こちらをコピーしておきます。

vscode-paste-1740621311307-m8yn3edm1lr.png

IAMロールの作成画面で、以下のように設定します。

項目 設定値
信頼されたエンティティタイプ AWSアカウント
別の AWS アカウントのアカウント ID Laravel VaporのAWSアカウントID
外部 ID Laravel Vaporの外部ID

許可ポリシーには、AdministratorAccessを付与します。ただし、これだと権限が強すぎますので、本番環境では適切な権限を設定してください。公式ドキュメントにも権限についての記載がありますので、参考にしてください。今回は検証のためにAdministratorAccessを付与します。

https://docs.vapor.build/introduction#permissions

IAMロールの作成が完了したら、IAMロールのARNをコピーしておきます。Laravel Vaporのダッシュボードに戻って、アカウント名(AWSアカウントIDである必要はありません)と、先ほどコピーしたIAMロールのARNを入力します。

サブミット後、以下のようになっていれば連携は完了です。

vscode-paste-1740621345035-c4nh5qipeg.png

プロジェクトの作成

同じくダッシュボードからプロジェクトを作成します。リージョンを選択し、プロジェクト名を入力します。プロジェクトを作成すると、Vaporは自動的にAWSアカウント内に各種リソース(Lambda関数、API Gateway、RDS、SQSなど)を作成する準備を整えます。

vscode-paste-1740621477147-852z0bmd2ze.png

ここからアプリケーションの開発を進めていきます。Laravel Vaporは、Laravelのプロジェクトをデプロイするためのプラットフォームですので、Laravelのプロジェクトを作成して進めていきます。

Laravelプロジェクトの作成

今回はお試しなので、手っ取り早くLaravelのプロジェクトを作成します。

composer global require laravel/installer

laravel new test-project

cd test-project

composer run dev

ローカルで起動することが確認できたら、次に依存関係をインストールします。

composer require laravel/vapor-core 

グローバルにVapor CLIをインストールします。

composer global require laravel/vapor-cli

Vapor CLIを使用するためにLaravel Vaporアカウントでログインします。

vapor login

 Email Address:
 > miyan@example.com


 Password:
 > 

Authenticated successfully.

最後にアプリケーションリポジトリのルートディレクトリにvapor.ymlファイルを作成します。

id: XXXXX
name: test-project
environments:
    production:
        memory: 1024
        cli-memory: 512
        runtime: 'php-8.4:al2'
        build:
            - 'composer install --no-dev'
            - 'php artisan event:cache'

この設定ファイルでは以下を指定しています。

  • memory: Lambdaのメモリ量(1024MB)
  • cli-memory: CLIコマンドのメモリ量(512MB)
  • runtime: PHP実行環境(PHP 8.4 on Amazon Linux 2)
  • build: デプロイ時に実行するコマンド

なお、vapor.ymlのidは、プロジェクト作成時に自動生成されるものですので、ダッシュボードから確認してコピーしてください。

準備は完了です。デプロイを開始します。

vapor deploy production

ビルド処理が始まり、デプロイに成功すると以下のようなメッセージが表示されます。

Project deployed successfully. (1m24s)

 =============== =========================================================================== 
  Deployment ID   Environment URL                                                            
 =============== =========================================================================== 
  XXXXXXX         https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws  
 =============== =========================================================================== 

URLにアクセスすると、Laravelの初期画面が表示されるはずです。

注意点

デフォルトでは、アセットファイルはS3で配信されます。アカウントレベルのブロックパブリックアクセス設定がオンになっているとデプロイに失敗しますので、オフにしておく必要があります。

また、Laravel VaporはAWSのさまざまなサービスを利用するため、料金が発生する可能性があります。特に、Lambda、RDS、S3、CloudFrontなどのサービスが利用されます。無料枠内で収まるかどうかは利用状況によるため、AWS Cost Explorerで定期的に確認することをお勧めします。

おわりに

Laravel Vaporを使ってみましたが、Laravelアプリケーションを簡単にデプロイすることができました。従来のEC2やECSと比較して、インフラ構成を意識することなくサーバレスアーキテクチャでアプリケーションを展開できる点が大きな利点です。また、自動スケーリングやAWS WAFとの連携など、エンタープライズレベルの機能も利用可能です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.