”AWS Lambda で Laravel を動かしてみた”をやってみた

すんません、完全に二番煎じなやつ書きます。アレンジはできたらするけどとりあえずやってみる。
ちょっとしたLTをやるかもしんなくて、そのネタをだいたいこういうので考えてるのですよ。

[AWS Lambda で Laravel を動かしてみた](https://tech.fusic.co.jp/cloud/lambda-laravel/)

## Lambda Layer を作る

そんなわけで見本の通りにとりあえずやってみる。なるほど、LambdaのLayer使うのね。一回やってみたかった。
しかし、難しいな。あんまりよくわからん。手を動かして覚えよう。

実はプライベートではec2使ってなくて、なんか作業する時はgcpの無料枠でやってたんだけど、これはec2のamazon linuxでやった方が間違いなさそうなのでt3.nano作ってやってみます。
落ちてもいいし、スポットインスタンスとやらを使ってみようかな。試しに。
通常のオンデマンドインスタンスは0.0068USD/Hらしいが、0.0041で入札してみた。月400円いかないくらいか。

で、無事作成できてsshもできたので進めていこう。

1. yumでgit入れる
2. git clone https://github.com/stackery/php-lambda-layer 
3. dockerいるって。 sudo amazon-linux-extras install docker
4. sudo service docker start
5. build.sh 差し替え （見本の通りに）
6. bootstrap 編集(見本の通りに)
5. sudo make (php-lambda-layer内で)
6. upload.shを編集。(md5をmd5sumに書き換えたりしたのとbucket作ったりregions.sh編集してap-northeast-1だけにしたり、bucket_name変えたり)
7. make upload
8. publish.shも編集 (bucket_name変えたり)
9. pip install (https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py)
10. sudo pip install -U awscli
11. make publish

したらなんかLayerはできた。
Lambda関数が動作するdocker環境とでも思えばいいんだろうか。

![29.png](https://qiita-image-store.s3.amazonaws.com/0/308709/90bc3eff-0cd7-18e3-2c23-376174bf97d5.png)


で、見本サイトの*SAM テンプレートを作成する*もやっておきます

## Lambda 関数を作る

なお、ホストにも必要なアプリケーションを入れておく

```
$ sudo amazon-linux-extras install php7.2  
$ sudo yum install -y php-cli php-mbstring php-mysqlnd php-opcache php-pdo php-pgsql zip
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar create-project --prefer-dist laravel/laravel laravel "5.7.*"
```

そしてキャッシュを/tmpに逃がすのもやっておく。
bootstrap/app.phpとconfig/cache.phpとconfig/view.phpの編集すね。あとconfig/session.phpも。

で、sam cliを入れる。ちなみにgccとかcppも入れました。

```
$ sudo pip install --user --upgrade aws-sam-cli
```

これもそのまま。

```
sam package \
    --template-file template.yml \
    --output-template-file serverless-laravel.yml \
    --s3-bucket <デプロイ用バケット名>
   
sam deploy \
    --template-file serverless-laravel.yml \
    --stack-name serverless-laravel \
    --capabilities CAPABILITY_IAM
```

## エラー

で、deployできたんだけど```{"message": "Internal server error"}```って出てしまったのでcloudwatchlogsみてみると以下のエラーが。

```
[Sat Dec 29 00:53:40 2018] PHP Fatal error: require(): Failed opening required '/var/task/public/../vendor/autoload.php' (include_path='.:/usr/share/pear7:/usr/share/php7') in /var/task/public/index.php on line 24
```

わからんけどcomposer installとかしとけばいいんかな。vendorディレクトリないし。
laravel directoryで```php ../composer.phar install```って打つ。
打ったらphpunitがどうたらって言われて、そんなんいらんからcomposer.jsonから消してもっかいcomposer install。

で、そしたら次はこんなエラー出た。

![30.png](https://qiita-image-store.s3.amazonaws.com/0/308709/cdc67a08-565f-a80b-0c57-3e4b14a2c523.png)

bootstrap/cacheに書き込めん、って言ってるのはわかるんだが・・はて。これを/tmpに持ってくにはどうしたらええんやろ。

と思ったけどartisan実行するといいだけだった。

```
$ sudo php artisan key:generate
$ sudo php artisan config:cache
```

![31.png](https://qiita-image-store.s3.amazonaws.com/0/308709/e6833e7f-d7bd-78dd-ed78-73a7aecd976b.png)

お、こうなればあと少しなきがする。
どうやら、viewをみるときはbootstrap/cache/config.phpを見てるっぽいが、これはdeploy環境でartisanを実行するとdeploy環境のpathになるらしい。
正攻法じゃないだろうけど、lambdaの環境とpath合わせてしまおうか。。

```
$ mv laravel /var/task
$ ln -s /var/task ./laravel
$ cd !$
$ sudo php artisan config:clear
$ sudo php artisan config:cache
```

これでどうだ！

![32.png](https://qiita-image-store.s3.amazonaws.com/0/308709/b5b1ed8c-b1bf-18fb-e3ca-00eb9cf02aed.png)

いけたわー。
しかし、結局*やってみた*だけだ。
vue.jsとか使ってみたかったんだけどもう眠いです。
今日はここまでー。

というか正直な所、laravelをサーバーレスでやる意味はあんまりわからんのですけどね。。