Comment monter un volume Amazon EFS sur un répertoire d'applications dans un environnement Elastic Beanstalk ?

Date de la dernière mise à jour : 18/03/2020

Je veux monter un volume Amazon Elastic File System (Amazon EFS) sur un répertoire d'applications de mon environnement AWS Elastic Beanstalk.

Brève description

La solution suivante utilise la pile de solutions PHP comme exemple.

Si vous utilisez une autre pile de solutions, suivez les mêmes étapes, mais choisissez le répertoire d'applications et le répertoire intermédiaire appropriés pour votre pile de solutions parmi les options suivantes :

-----------------------------------------------------
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
-----------------------------------------------------

Important : vous ne pouvez pas monter un volume Amazon EFS directement sur le répertoire d'applications, car le contenu de /var/app/current est déplacé vers /var/app/current.old chaque fois qu'une application Elastic Beanstalk est déployée. Le groupe source déployé actuel est déplacé vers le répertoire d'applications. Si vous montez le volume Amazon EFS sur /var/app/current, ce volume est déplacé vers /var/app/current.old une fois le déploiement terminé. Par exemple, consultez la sortie eb-activity.log suivante :

===============================
[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
===============================

Solution

1.    Vérifiez que votre groupe de fichiers source est décompressé dans le répertoire intermédiaire. Consultez l'exemple desortie eb-activity.log suivant :

===============================
[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
===============================

Remarque : tous les hooks appdeploy pre/ dans /opt/elasticbeanstalk/hooks/appdeploy/pre/ et .ebextensions sont exécutés dans le répertoire intermédiaire.

2.    Créez un dossier .ebextensions dans le répertoire racine du groupe source.

3.    Ajoutez un fichier de configuration formaté (YAML ou JSON) à votre répertoire pour monter un volume Amazon EFS dans un répertoire spécifique (par exemple, /efs).

4.    Pour monter votre volume Amazon EFS sur un répertoire d'applications, suivez les étapes décrites dans l'une des sections Option 1 ou Option 2 suivantes.

(Option 1) Créez un lien symbolique vers un répertoire intermédiaire avant que le script flip déplace le contenu du répertoire intermédiaire vers le répertoire d'applications

Lorsque les hooks appdeploy enact sont exécutés au cours d'un déploiement dans un environnement Elastic Beanstalk, le contenu du répertoire intermédiaire est déplacé vers le répertoire d'applications. Par exemple, dans une solution PHP, le script flip.sh (premier script de AppDeployEnactHook dans /opt/elasticbeanstalk/hooks/appdeploy/enact/) déplace le contenu du répertoire intermédiaire vers le répertoire d'applications.

Pour créer un lien symbolique à partir de /efs qui pointe vers le répertoire intermédiaire, utilisez container_commands pour créer un fichier .config dans votre dossier .ebextensions. Reportez-vous à l'exemple suivant :

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

Remarque : après le déploiement, le lien symbolique pointe vers le répertoire d'applications.

(Option 2) Créez un lien symbolique vers un répertoire d'applications après que le script flip a déplacé le contenu du répertoire intermédiaire vers le répertoire d'application

Pour créer un lien symbolique qui pointe vers le répertoire d'applications, créez un fichier .config dans votre dossier .ebextensions. Reportez-vous à l'exemple suivant :

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/

Remarque : le fichier .config précédent utilise la clé files pour créer un fichier script .sh dans les hooks de appdeploy post. Le script .sh crée un lien symbolique dans le dossier de l'application une fois que le script flip a déplacé le contenu du répertoire intermédiaire vers le répertoire d'applications.


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?