Elastic Beanstalk 環境のアプリケーションディレクトリに Amazon EFS ボリュームをマウントする方法を教えてください。
最終更新日: 2020 年 12 月 28 日
AWS Elastic Beanstalk 環境のアプリケーションディレクトリに Amazon Elastic File System (Amazon EFS) ボリュームをマウントしたいと考えています。
簡単な説明
次の解決方法では、PHP ソリューションスタックを例として使用して、Amazon Linux 1 ベースのプラットフォームに Amazon EFS ボリュームをマウントするための一般的な手順を示します。
別のソリューションスタックを使用している場合も同じ手順を実行しますが、次のオプションからソリューションスタックの正しいアプリケーションディレクトリとステージングディレクトリを選択してください。
-----------------------------------------------------
Solution stack Application directory Staging directory
Nodejs /var/app/current /tmp/deployment/application
PHP /var/app/current /var/app/ondeck
Ruby (Passenger) /var/app/current /var/app/ondeck
Ruby (Puma) /var/app/current /var/app/ondeck
Java with Tomcat /usr/share/tomcat*/webapps/ROOT /tmp/deployment/application/ROOT
Java SE /var/app/current /var/app/staging
Python /opt/python/current/app /opt/python/ondeck/app
Go /var/app/current /var/app/staging
Single Container Docker /var/app/current /var/app/staging
Multi-Container Docker /var/app/current /var/app/staging
-----------------------------------------------------
重要: Amazon EFS ボリュームをアプリケーションディレクトリに直接マウントすることはできません。これは、Elastic Beanstalk アプリケーションをデプロイするたびに、/var/app/current のコンテンツが /var/app/current.old に移動するためです。現在デプロイされているソースバンドルは、アプリケーションディレクトリに移動されます。Amazon EFS ボリュームを /var/app/current にマウントすると、そのボリュームはデプロイ完了後に /var/app/current.old に移動されます。例については次の eb-activity.log 出力を参照してください。
===============================
[2020-02-12T02:28:18.237Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage1/AppDeployEnactHook/01_flip.sh] : Starting activity...
[2020-02-12T02:28:18.431Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage1/AppDeployEnactHook/01_flip.sh] : Completed activity. Result:
++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir
+ EB_APP_STAGING_DIR=/var/app/ondeck
++ /opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir
+ EB_APP_DEPLOY_DIR=/var/app/current
+ '[' -d /var/app/current ']'
+ mv /var/app/current /var/app/current.old
+ mv /var/app/ondeck /var/app/current
+ nohup rm -rf /var/app/current.old
===============================
解決方法
1. ソースバンドルがステージングディレクトリに解凍されていることを確認します。次の eb-activity.log 出力の例をご参照ください。
===============================
[2020-02-12T02:28:16.336Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage0/AppDeployPreHook/01_unzip.sh] : Starting activity...
[2020-02-12T02:28:16.631Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage0/AppDeployPreHook/01_unzip.sh] : Completed activity. Result:
++ /opt/elasticbeanstalk/bin/get-config container -k app_user
+ EB_APP_USER=webapp
++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir
+ EB_APP_STAGING_DIR=/var/app/ondeck
++ /opt/elasticbeanstalk/bin/get-config container -k source_bundle
+ EB_SOURCE_BUNDLE=/opt/elasticbeanstalk/deploy/appsource/source_bundle
+ rm -rf /var/app/ondeck
+ /usr/bin/unzip -d /var/app/ondeck /opt/elasticbeanstalk/deploy/appsource/source_bundle
Archive: /opt/elasticbeanstalk/deploy/appsource/source_bundle
creating: /var/app/ondeck/.ebextensions/
inflating: /var/app/ondeck/.ebextensions/logging.config
inflating: /var/app/ondeck/scheduled.php
inflating: /var/app/ondeck/index.php
inflating: /var/app/ondeck/cron.yaml
inflating: /var/app/ondeck/styles.css
extracting: /var/app/ondeck/logo_aws_reduced.gif
+ chown -R webapp:webapp /var/app/ondeck
+ chmod 775 /var/app/ondeck
===============================
注: /opt/elasticbeanstalk/hooks/appdeploy/pre/ および .ebextensions にあるすべての appdeploy pre hook は、ステージングディレクトリで実行します。
2. ソースバンドルのルートディレクトリに .ebextensions フォルダを作成します。
3. 特定のディレクトリ (/efs) などに Amazon EFS ボリュームをマウントするには、フォーマット済み設定ファイル(YAML または JSON)をディレクトリに追加します。
4. Amazon EFS ボリュームをアプリケーションディレクトリにマウントするには、ステージングディレクトリへのシンボリックリンクを作成する必要があります。ステージングディレクトリを指す /efs からシンボリックリンクを作成するには、container_commands を使用して .ebextensions フォルダに .config ファイルを作成します。例:
container_commands:
01_symlink:
command: ln -s /efs /var/app/ondeck/
注: Elastic Beanstalk 環境でのデプロイ中に appdeploy enact hook を実行すると、ステージングディレクトリのコンテンツはアプリケーションディレクトリに移動します。PHP ソリューションの場合、flip.sh スクリプトはステージングディレクトリのコンテンツをアプリケーションディレクトリに移動させます。flip.sh スクリプトは、/opt/elasticbeanstalk/hooks/appdeploy/enact/ にある AppDeployEnactHook の最初のスクリプトです。