11
8

More than 3 years have passed since last update.

Brefを利用したサーバレスLaravelアプリケーションの構築

Last updated at Posted at 2021-08-04

Brefを理解するためにプロジェクト作り直して一から勉強中の忘備録。
まずはBrefの存在意義について。

なぜBrefを使うのか

AWS Lambdaがサポートする言語は現時点(2021/8/31)で、Java、Go、PowerShell、Node.js、C#、Python、Rubyのみ。
これらの言語を使用する場合はLambda上でコードを書いて動かすことができるが、PHPはサポートされていない。

Lambdaは、その他の言語を使用できるようにするためランタイムAPIという機能を提供している。
PHPを使用するには、カスタムランタイム機能を使って自分でランタイム環境をビルドして、bootstrapというカスタムランタイムのエンドポイントとなるファイルを用意する必要がある。
これがまぁまぁ面倒くさい。

brefを使うと、その部分をServerless Frameworkを利用してサクッと自動構築してくれて、サーバーレスPHPアプリケーションを簡単に作成できる。

3_bref_flow_ja.png

以下はLaravelでのBref導入時の手順。

1. Serverless Frameworkのインストール

$ npm install -g serverless
$ serverless config credentials --provider aws --key <key> --secret <secret>

Serverless Frameworkとは、AWSならCloudFromationといったクラウドの構築管理サービスといい感じに連携してくれるOSS。(説明雑

2. Laravelプロジェクトを作成

$ composer create-project laravel/laravel sample-serverless-laravel
$ cd sample-serverless-laravel

今回は新しく作成しているけど既存のプロジェクトでもOK。

3. Bref&Laravel-Brefパッケージをインストール

$ composer require bref/bref
$ composer require bref/bref bref/laravel-bridge --update-with-dependencies

Laravel-Brefパッケージは、Laravelでのログドライバやセッションドライバの設定をサーバレス用にいい感じに設定してくれる。

4. serverless.yml構成ファイルを作成

$ php artisan vendor:publish --tag=serverless-config
Copied File [/vendor/bref/laravel-bridge/config/serverless.yml] To [/serverless.yml]
Publishing complete.

以下のようなファイルがプロジェクトディレクトリに作成される。

serverless.yml
service: laravel

provider:
    name: aws
    # The AWS region in which to deploy (us-east-1 is the default)
    region: us-east-1
    # The stage of the application, e.g. dev, production, staging… ('dev' is the default)
    stage: dev
    runtime: provided.al2

package:
    # Directories to exclude from deployment
    exclude:
        - node_modules/**
        - public/storage
        - resources/assets/**
        - storage/**
        - tests/**

functions:
    # This function runs the Laravel website/API
    web:
        handler: public/index.php
        timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
        layers:
            - ${bref:layer.php-74-fpm}
        events:
            -   httpApi: '*'
    # This function lets us run artisan commands in Lambda
    artisan:
        handler: artisan
        timeout: 120 # in seconds
        layers:
            - ${bref:layer.php-74} # PHP
            - ${bref:layer.console} # The "console" layer

plugins:
    # We need to include the Bref plugin
    - ./vendor/bref/bref

必要ならregion: us-east-1の部分をregion: ap-northeast-1(東京リージョン)に変える。

5. キャッシュクリア

プロジェクト作成直後は必要ないけど、二度目以降はキャッシュが残るのでデプロイ前にキャッシュクリアが必要。

$ php artisan config:clear
Configuration cache cleared!

6. デプロイ

$ serverless deploy
Service Information
service: laravel
stage: dev
region: us-east-1
stack: laravel-dev
resources: 14
api keys:
  None
endpoints:
  ANY - https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com
functions:
  web: laravel-dev-web
  artisan: laravel-dev-artisan
layers:
  None

デプロイ確認

一応AWSコンソール上でもデプロイ確認。
AWS CloudFormationにアクセス。
イベントタブやリソースタブで各リソースがCREATE_COMPLETEまたはUPDATE_COMPLETEになっていればOK。

スクリーンショット 2021-08-04 18.30.54.png

artisanコマンド確認

vendor/bin/bref cli <function-name> -- <command>

使用例↓

$ vendor/bin/bref cli laravel-dev-artisan -- inspire

誰かの名言が出てきたらOK。無事にbref上でphp artisanのコマンドが使えている。

記事に間違いあったらご指摘ください。
次回はRDSを構成して繋げる部分を書いていきます。

参考

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8