LoginSignup
33
23

More than 3 years have passed since last update.

AWS LambdaでLaravelを動かす

Last updated at Posted at 2019-12-24

最近サーバーレス(Lambda)に興味があったので始めてみるかとは思ったものの
好きな言語であるPHPは標準でサポートされておらず。。。
どうにか動かす方法はないかと調べていたところ、brefなるものを使えば簡単に動かせそう!しかもLaravelも動かせる⁉
だったので、その手順をまとめてみました。

準備

以下のものが必要になります.

  • AWSアカウント
  • AWS CLI
  • AWSアカウントアクセスキー及びシークレットキー
  • npmコマンド

こちらの準備については記事の内容ではないのでスキップします。

serverlessコマンドをインストール

まずはserverlessコマンドをインストールします。
こちらはLambdaをデプロイする際に使用します。

$ npm install -g serverless

serverlessコマンドのインストールが完了したら、AWSアクセスキー及びシークレットアクセスキーを設定します

$ serverless config credentials --provider aws --key <key> --secret <secret>

注意点として、AWS CLIのデフォルトアカウントを設定している場合は
そのアカウントが使用されるので上記の手順は不要です。

Laravelプロジェクト作成

まずはcomposerコマンドでlaravelプロジェクトを作成しましょう

$ composer create-project laravel/laravel serverless-laravel --prefer-dist

brefを追加

$ cd serverless-laravel
$ composer require bref/bref

注意点として、brefの最新バージョンを使用するにはPHP7.2以上が要求されます。
PHP7.1以下で使用したい場合はbref0.5未満を使用する必要があるみたいです(未確認)
参考: https://bref.sh/docs/installation.html#bref

serverless.ymlを用意

serverless.ymlをプロジェクトディレクトリ直下に作成します。

serverless.yml
service: serverless-laravel

provider:
    name: aws
    region: ap-northeast-1
    runtime: provided
    environment:
        # Laravel environment variables
        APP_STORAGE: '/tmp'

plugins:
    - ./vendor/bref/bref

functions:
    website:
        handler: public/index.php
        timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
        layers:
            - ${bref:layer.php-73-fpm}
        events:
            -   http: 'ANY /'
            -   http: 'ANY /{proxy+}'
    artisan:
        handler: artisan
        timeout: 120 # in seconds
        layers:
            - ${bref:layer.php-73} # PHP
            - ${bref:layer.console} # The "console" layer

Lambda上でLaravelを動かすためにコードを変更

Lambdaでは/tmpディレクトリ以外への書き込みは出来ないため、Laravelが書き込みを行う領域を変える必要があります。

bootstrap/app.php
# $appを作成している行の直後に記載
$app->useStoragePath($_ENV['APP_STORAGE'] ?? $app->storagePath());
.env
VIEW_COMPILED_PATH=/tmp/storage/framework/views
SESSION_DRIVER=array
LOG_CHANNEL=stderr
app/Providers/AppServiceProvider.php
    public function boot()
    {
        if (! is_dir(config('view.compiled'))) {
            mkdir(config('view.compiled'), 0755, true);
        }
    }

デプロイ準備

デプロイを行う前に、開発用パッケージなど不要なものを削除します。
ただし、require-devでインストールした依存関係が削除されるので注意してください

$ composer install --prefer-dist --optimize-autoloader --no-dev

デプロイ

$ serverless deploy
.....
endpoints:
  ANY - https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/dev
  ANY - https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/dev/{proxy+}

デプロイが完了すると、コンソールにAPI GatewayのエントリーポイントのURLが表示されるのでアクセスしてみます。

image.png

デプロイしたものを削除する

removeコマンドで削除できます。

$ serverless remove

参考:
https://bref.sh/docs/

33
23
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
33
23