BLOG

LambdaでSymfony4が動いた!

2019-01-07 17:56:00

Symfony4 Lambda PHP

Result

11月に『LambdaでPHPが動くので、とりあえずSymfony4を入れてみた』で、LambdaのカスタムランタイムでSymfony4を動かそうとして無事失敗しましたが、冬休みに再挑戦してみたところ無事動かすことができました!

なにがダメだったのか?

3つの要因があり、実行することができませんでした。その要因とは...

php.iniがなかった

GitHubにこう記載があるのを見事に見落としてました。

These extensions are not loaded by default. You must add the extension to a php.ini file to use it

Extensionは用意してあるものの、デフォルトではロードされていなかったのです。よって以下のphp.iniをsrc/php(src/serverから変えました)に配置します。

extension=ctype.so
extension=dom.so
extension=tokenizer.so
extension=json.so

template.yamlの記述が少し違った

以下のようになりました。

AWSTemplateFormatVersion: 2010-09-09
Description: My PHP Application
Transform: AWS::Serverless-2016-10-31
Resources:
 phpserver:
 Type: AWS::Serverless::Function
 Properties:
 FunctionName: !Sub ${AWS::StackName}-phpserver
 Description: PHP Webserver
 CodeUri: src/php
 Runtime: provided
 Handler: router.php
 MemorySize: 3008
 Timeout: 30
 Tracing: Active
 Layers:
 - !Sub arn:aws:lambda:${AWS::Region}:887080169480:layer:php71:5
 Events:
 api:
 Type: Api
 Properties:
 Path: /{proxy+}
 Method: ANY

変わったところはLayers部分。php71:3からphp71:5に変わりました。ここが3のままだとphp.iniを読み込むことができなかったのです。現在GitHubでは6になっていますが、4以上であれば大丈夫だと思います。

キャッシュ・ログの置き場所を変える必要があった

Symfony4のデフォルトのキャッシュ・ログ置き場はプロジェクト内のvar以下です。しかし、カスタムランタイムで実行する際、プロジェクト内は書き込み不可な状態となっているためPermission Deniedとなり、エラーになります。そこで、src/Kernel.phpを一部書き換えて、置き場所を変更します。

 public function getCacheDir()
 {
 return '/tmp/cache/' . $this->environment;
// return $this->getProjectDir().'/var/cache/'.$this->environment;
 }

 public function getLogDir()
 {
 return '/tmp/log';
// return $this->getProjectDir().'/var/log';
 }

置き場所を/tmp(テンポラリー領域)に変更します。これでキャッシュ・ログが保存でき、エラーになりません。

結果

このように実行できました!