如何将 Amazon EFS 卷挂载到 Elastic Beanstalk 环境中的应用程序目录?

上次更新时间:2020 年 3 月 18 日

我想将一个 Amazon Elastic File System (Amazon EFS) 卷挂载到我 AWS Elastic Beanstalk 环境中的一个应用程序目录。

简短描述

下面的解决方法将以 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 挂钩都在暂存目录中执行。

2.    在源服务包的根目录中创建一个 .ebextensions 文件夹

3.    将格式化后的配置文件(YAML 或 JSON)添加到您的目录,以将 Amazon EFS 卷挂载到指定的目录(例如 /efs)。

4.    要将 Amazon EFS 卷挂载到应用程序目录,完成选项 1 或选项 2 部分的步骤即可。

(选项 1)首先创建指向暂存目录的 symlink,然后执行 flip 脚本以将暂存目录中的内容移动到应用程序目录

在 Elastic Beanstalk 环境中部署期间执行 appdeploy enact 挂钩时,暂存目录的内容将会移到应用程序目录。例如,在 PHP 解决方案中,flip.sh 脚本(/opt/elasticbeanstalk/hooks/appdeploy/enact/AppDeployEnactHook 的第一个脚本)会将暂存目录中的内容移动到应用程序目录。

要从 /efs 创建一个指向暂存目录的 symlink,请使用 container_commands.ebextensions 文件夹中创建一个 .config 文件。请参阅以下示例:

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

注意:symlink 部署后将指向应用程序目录。

(选项 2)首先执行 flip 脚本以将暂存目录中的内容移动到应用程序目录,然后创建指向应用目录的 symlink

要创建指向应用程序目录的 symlink,请在 .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 挂钩中创建 .sh 脚本文件。执行 flip 脚本以将暂存目录中的内容移动到应用程序目录后,.sh 脚本将在应用程序文件夹中创建一个 symlink。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?