AWS
ElasticBeanstalk
CustomPlatform

ElasticBeanstalk custom platformでcontainer_commandの実行ディレクトリを設定する

TL;DR

platform.yaml でapp_staging_dirを指定するだけでOK。

container:
  app_staging_dir: "/var/app/staging"

詳細

Elastic Beanstalkで選択できるプラットフォームでは、アプリのデプロイ時に実行するcontainer_commandはサーバ上に展開したアプリのソースコードのルートで実行される。と、AWSのドキュメントにもそんな様なことが書かれている。

私の知る限り少なくともPHPのプラットフォームではそうなっており、container_commandにでlsすると、ログにソースコードのファイルがちゃんとでてくる。

しかし、Elastic BeanstalkのドキュメントにあるサンプルNodePlatform_Ubuntuでカスタムプラットフォームを作成したら、container_commandの実行ディレクトリがソースコードが展開される場所ではなく/tmpになってしまう。

デプロイ時にソースコードに含んだファイルでなにかしようと思ったらこれは不便極まりない。

いろいろ調べていたら、インスタンス上でget-config containerを実行することで確認できるapp_staging_dirがどうもこのワーキングディレクトリを決めているっぽい。でも、どうやってそれを設定するかは結局どこっにも見つけることは出来なかった。

ubuntu@ip-xxxxxx:~$ sudo /opt/elasticbeanstalk/bin/get-config container --output YAML
---
app_staging_dir: "/tmp"
instance_port: '80'
config_staging_dir: "/tmp"
common_log_list:
- "/var/log/eb-activity.log"
log_group_name_prefix: "/aws/elasticbeanstalk"
source_bundle: "/opt/elasticbeanstalk/deploy/appsource/source_bundle"

万策尽きて、get-configのサブコマンドがcontainerであることから、ダメ元で、カスタムプラットフォームを作成するファイルの platform.yaml にcontainerセクションを追記してみたら・・・、あっさりできてしまった。

version: "1.0"

provisioner:
  type: packer
  template: custom_platform.json
  flavor: ubuntu1604

metadata:
  maintainer: pikanji
  description: Ubuntu nginx PHP7.0 php-fpm
  operating_system_name: Ubuntu
  operating_system_version: 16.04
  programming_language_name: PHP
  programming_language_version: 7.0
  app_server_name: "none"
  app_server_version: "none"

container:
  app_staging_dir: "/var/app/staging"

いやー、これくらいドキュメントに書いておいてよAmazonさん・・・。