Elastic Beanstalk 環境のアプリケーションディレクトリに Amazon EFS ボリュームをマウントする方法を教えてください。

最終更新日: 2020 年 3 月 18 日

AWS Elastic Beanstalk 環境のアプリケーションディレクトリに Amazon Elastic File System (Amazon EFS) ボリュームをマウントする事を考えています。

簡単な説明

次の解決策では、PHP ソリューションスタックを例として使用します。

別のソリューションスタックを使用している場合も同じ手順を実行しますが、以下のオプションからソリューションスタックの正しいアプリケーションディレクトリとステージングディレクトリを選択してください。

-----------------------------------------------------
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.    フォーマットされた設定ファイル (YAML または JSON) をディレクトリに追加して、Amazon EFS ボリュームを特定のディレクトリ (/efs) などにマウントします。

4.    Amazon EFS ボリュームをアプリケーションディレクトリにマウントするには、以下のオプション 1 またはオプション 2 のいずれかのセクションの手順を実行します。

(オプション 1) フリップスクリプトがステージングディレクトリのコンテンツをアプリケーションディレクトリに移動させる前に、ステージングディレクトリへのシンボリックリンクを作成する

Elastic Beanstalk 環境でのデプロイ中に appdeploy enact hook が実行されると、ステージングディレクトリのコンテンツはアプリケーションディレクトリに移動されます。たとえば、PHP ソリューションでは、flip.sh スクリプト (/opt/elasticbeanstalk/hooks/appdeploy/enact/ 内にある AppDeployEnactHook の最初のスクリプト) は、ステージングディレクトリのコンテンツをアプリケーションディレクトリに移動します。

ステージングディレクトリをポイントする /efs からシンボリックリンクを作成するには、container_commands を使用して .ebextensions フォルダに .config ファイルを作成します。次の例をご参照ください。

container_commands:
  01_symlink:
    command: ln -s /efs /var/app/ondeck/

注意: デプロイ後は、シンボリックリンクはアプリケーションディレクトリをポイントします。

(オプション 2) フリップスクリプトがステージングディレクトリのコンテンツをアプリケーションディレクトリに移動した後、アプリケーションディレクトリへのシンボリックリンクを作成する

アプリケーションディレクトリを指すシンボリックリンクを作成するには、.ebextensions フォルダに .config ファイルを作成します。次の例をご参照ください。

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/01_create_symlink.sh" :
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/sh
      ln -s /efs /var/app/current/

注意: 上記の .config ファイルは files キーを使用して、appdeploy post hook に .sh スクリプトファイルを作成します。.sh スクリプトは、フリップスクリプトがステージングディレクトリのコンテンツをアプリケーションディレクトリに移動した後、アプリケーションフォルダにシンボリックリンクを作成します。


この記事は役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合