如何将 Amazon EFS 卷挂载到 Elastic Beanstalk 环境中的应用程序目录?
上次更新时间:2020 年 12 月 28 日
我想将一个 Amazon Elastic File System (Amazon EFS) 卷挂载到我 AWS Elastic Beanstalk 环境中的一个应用程序目录。
简短描述
以下解决方案以 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 挂钩都在暂存目录中运行。
2. 在源服务包的根目录中创建一个 .ebextensions 文件夹。
3. 要将 Amazon EFS 卷挂载到指定的目录(例如 /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 挂钩时,暂存目录的内容将会移到应用程序目录。例如,在 PHP 解决方案中,flip.sh 脚本将暂存目录的内容移动到应用程序目录。flip.sh 脚本是/opt/elasticbeanstalk/hooks/appdeploy/enact/ 中 AppDeployEnactHook 的第一个脚本。