Amazon Linux 2なElasticBeanstalk PHPプラットフォームでLaravelを動作させる方法
対象プラットフォーム:PHP 7.4 running on 64bit Amazon Linux 2/3.0.1
AWS ElasticBeanstalk PHPプラットフォームのOSが最近のものが Amazon Linux から Amazon Linux 2 に変わった。試しに Laravel アプリケーションをデプロイしてみると、ルート(/)アドレス以外のパスが 404 として nginx からレスポンスされる。以前はApacheで.htaccessが効く設定だったので、Laravelのドキュメントルートさえ合わせればそのまま動作した。そこで対応しようとしたら、ちょっとハマったので記録に残しておく。
対応方法自体は nginx の location ディレクティブで index.php に集約させればいいのだが、肝心の conf ファイルがどうもうまくデプロイされない。試した方法は、従来通りに .ebextentions 内に laravel.config ファイルを作成し、nginx用の設定が include される場所にファイルとして作成されるようにした。のだが、デプロイ後のEC2インスタンスにsshして /etc/nginx/conf.d/ の中を ls してみるとファイルが作成されていない。eb deploy 自体は成功するのに、だ。
# 失敗例 # .ebextentions/laravel.config files: /etc/nginx/conf.d/laravel.conf: mode: "000644" owner: root group: root content: | # Redirect HTTP To HTTPS location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } [ec2-user@xx-xx-xx-xx conf.d]$ ls -l /etc/nginx/conf.d/ 合計 8 drwxrwxr-x 2 webapp webapp 62 6月 2 13:01 elasticbeanstalk -rw-r--r-- 1 root root 147 6月 2 13:01 healthd_logformat.conf -rw-r--r-- 1 root root 181 6月 2 13:01 php-fpm.conf (laravel.conf が作られていない)
configが読み込まれているかをチェックするために/tmp/以下を指定してみるとちゃんと作られている。そして/tmp/以下に作られたファイルの日付と、/etc/nginx/ の日付を比べてみると、/etc/nginx/ の方が後になっている。なので推測としては、 .ebextentions の内容が実行されてから、EC2内のnginxのプロビジョニングが行われており、ファイルは多分作られているけど、あとから消えていると思われる。
そして正解は「.platform」という、おそらくAmazon Linux 2 版から導入されたと思わしき特別なディレクトリのしかるべき位置にnginx用のconfファイルそのものを配置する必要があった。
参考:Elastic Beanstalk Linux プラットフォームの拡張 - AWS Elastic Beanstalk https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/platforms-linux-extend.html
しかるべき位置は、 .platform/nginx/conf.d/elasticbeanstalk/*.conf だ。だいぶ深い。ちなみに横着して conf.d/ の中に conf.d/laravel.conf と配置したりするとデプロイエラーになる。
また、nginx用のconfファイルの内容そのものをファイルとして配置する必要がある。.ebextentions 内に作るYAMLのconfigファイルではなく、そのままの内容だ。
# 成功例 # .platform/nginx/conf.d/elasticbeanstalk/laravel.conf location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } [ec2-user@xx-xx-xx-xx conf.d]$ ls -l /etc/nginx/conf.d/elasticbeanstalk/ 合計 12 -rw-r--r-- 1 root root 215 6月 2 13:01 healthd.conf -rw-rw-r-- 1 webapp webapp 86 6月 2 04:01 laravel.conf -rw-r--r-- 1 root root 1599 6月 2 13:01 php.conf
ファイルがwebappユーザーで作られているのがいささか気になるが、これで動作したのでとりあえずはOKだ。
そしてドキュメントをよく見たらデプロイワークフロー図があった。
.ebextentions/*.config 内の files は 1.a の commands: に含まれるのだろうか?気が向いたらサポートに問い合わせてみようと思う。
コメント / トラックバック