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


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

AWS 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 編集(見本の通りに)
  7. sudo make (php-lambda-layer内で)
  8. upload.shを編集。(md5をmd5sumに書き換えたりしたのとbucket作ったりregions.sh編集してap-northeast-1だけにしたり、bucket_name変えたり)
  9. make upload
  10. publish.shも編集 (bucket_name変えたり)
  11. pip install (https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py)
  12. sudo pip install -U awscli
  13. make publish

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

で、見本サイトの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。

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

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

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

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

お、こうなればあと少しなきがする。
どうやら、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

これでどうだ!

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

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