Laravelのサーバレス用ライブラリbrefを使い、lambdaでhello world

2021/02/24現在はコンテナでlambdaにできるようになってる他、その他多くの手順もベターなものがあり、リライトしました。
当記事ではなく、こちらをご参照ください。
https://qiita.com/umihico/items/514cf792d30bf3706ef5

プロジェクトを作ってから少し手を加えるだけで、Laravelのサーバレス化ができました。
AWS上のデプロイはServerless Frameworkが全てやってくれます。

[本家のドキュメントはこちら](https://bref.sh/docs/frameworks/laravel.html)
[Githubはこちら](https://github.com/umihico/laravel-demo)

```bash
composer create-project --prefer-dist laravel/laravel laravel-demo #プロジェクト作成
cd laravel-demo
composer require bref/bref #肝のbrefインストール
```

以下の編集を加えます。[b508b15](https://github.com/umihico/laravel-demo/commit/b508b15edf5d1f0a0a7b51e2360e4f390da3dac1)

```diff:.env
- SESSION_DRIVER=file
+ SESSION_DRIVER=array
+ VIEW_COMPILED_PATH=/tmp/storage/framework/views
```

```diff:config/logging.php
         'stack' => [
             'driver' => 'stack',
-            'channels' => ['single'],
+            'channels' => ['stderr'],
             'ignore_exceptions' => false,
         ],
```

```diff:app/Providers/AppServiceProvider.php
     public function boot()
     {
-        //
+        if (!is_dir(config('view.compiled'))) {
+            mkdir(config('view.compiled'), 0755, true);
+        }
     }
 }
```

最後に`serverless.yml`を追加します。[007fb31](https://github.com/umihico/laravel-demo/commit/007fb3114953b4a80b29e6ab90852ccb217b10f0)

```yml:serverless.yml
service: laravel-demo

provider:
  name: aws
  region: ap-northeast-1
  runtime: provided

plugins:
  - ./vendor/bref/bref

package:
  exclude:
    - node_modules/**
    - public/storage
    - storage/**
    - tests/**

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
```

本家の`artisan`コマンド用関数ですが、私はローカルでしか実行しないのでコメントアウトしています。

デプロイコマンドは`php artisan config:clear`と`sls deploy`のセットです。
以下のアウトプットになりました。

```bash
$ php artisan config:clear
Configuration cache cleared!

$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
........
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service laravel-demo.zip file to S3 (14.19 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.................................
Serverless: Stack update finished...
Service Information
service: laravel-demo
stage: dev
region: ap-northeast-1
stack: laravel-demo-dev
resources: 12
api keys:
  None
endpoints:
  ANY - https://td3rzowchc.execute-api.ap-northeast-1.amazonaws.com/dev
  ANY - https://td3rzowchc.execute-api.ap-northeast-1.amazonaws.com/dev/{proxy+}
functions:
  website: laravel-demo-dev-website
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.


```

さっそく https://td3rzowchc.execute-api.ap-northeast-1.amazonaws.com/dev にアクセスしてみましょう。
<img width="1138" alt="スクリーンショット 2020-03-21 8.50.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256466/e0e4c97d-c818-c775-5eca-b5a3c6605fc9.png">

以上です。以下の課題に対しても記事投稿予定です。

1. [URLにあるステージのパスが外せないことによる不具合が多いので、カスタムドメインを導入する](https://qiita.com/umihico/items/e4f157991929f90fa571)
1. [Basic認証を付与する](https://qiita.com/umihico/items/df2b8ce78cfe18054337)
1. public配下が参照されず、jsとcssが参照できない。
1. slsコマンドと同期して.envを環境毎に使い分けたい。
1. セッション含めDB接続したいがサーバレスはコネクションプール問題がある。