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: に含まれるのだろうか?気が向いたらサポートに問い合わせてみようと思う。

コメント / トラックバック

コメントは受け付けていません。