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さん・・・。