首页 > 解决方案 > Elastic Beanstalk - EFS 无法在部署时挂载 - 设备或资源繁忙

问题描述

我正在关注 AWS 教程,该教程告诉我们如何将 EFS 系统安装到https://aws.amazon.com/premiumsupport/knowledge-center/elastic-beanstalk-mount-efs-volumes/上可用的弹性 beanstalk 实例。

我将此文件夹安装在current文件夹中,因为我的 Web 应用程序需要将其作为路径访问,例如:public/medias. 所以我在我的应用程序公共文件夹中安装 EFS,所有媒体都可以通过网络服务器访问。

第一次安装没问题,但是在第一次部署之后,似乎弹性豆茎在清理app/current文件夹以进行新部署时试图删除该文件夹,然后部署无法删除当前内部的已安装单元,并显示一条消息can not remove directory - Device or resource busy.

无法将 EFS 目录挂载到current弹性 beantalk 的文件夹中?或者我应该考虑将它安装在应用程序文件夹之外,然后我可以使用符号链接之类的东西通过 Web 服务器访问文件?

我将其安装在内部的原因var/app/current/public/media是因为它需要通过https://mywebsite.com/media/myImage.png=> 访问,这应该来自 EFS。

我可以考虑S3 Buckets改用,但我所有的 Web 应用程序都在使用静态路径读取文件,将其迁移到从存储桶中读取将是一项巨大的工作。

标签: amazon-web-servicesdockeramazon-elastic-beanstalkamazon-efs

解决方案


我有一段时间遇到同样的问题,最后在 AWS 知识中心的这篇文章中找到了答案:

重要提示:您无法将 Amazon EFS 卷直接挂载到应用程序目录,因为每当您部署 Elastic Beanstalk 应用程序时,/var/app/current 的内容都会移动到 /var/app/current.old。

解决方案是将 EFS 挂载到其他目录,并在该目录和您的/current目录或您要挂载到的任何其他子目录之间创建符号链接/var/app/current

我通过将我的storage-efs-mountfilesystem.config(在 .ebextensions -例如 efs-mountfilesystem.config 中)修改为挂载到/efs而不是,并在运行此命令的 .ebextensions 中/var/app/current/wwwroot/user_content添加了一个新的(将其命名为任意名称)配置文件来做到这一点:storage-efs-symlink.config

container_commands:
  01_symlink:
    command: ln -s /efs ./wwwroot/user_content

第一个参数是您指定为 EFS 挂载点的位置,第二个参数是您的应用程序尝试读取/写入的位置(在我的情况下为/var/app/current/wwwroot/user_content-> ./wwwroot/user_content)。

(注意相对路径。需要是相对路径,因为这些命令是在应用还在的时候执行的/var/app/staging,所以/current目录还不存在。更多信息在这里。

这是我在尝试部署 EFS 安装在 /var/app/current 中的弹性 beanstalk 应用程序时在 eb-engine.log 中的确切错误:An error occurred during execution of command [app-deploy] - [FlipApplication]. Stop running the command. Error: remove current dir failed: unlinkat /var/app/current/wwwroot/user_content: device or resource busy

如果您还没有 .ebextensions 文件夹,您可以自己创建它并确保它最终出现在您的应用程序源包中。有关 .ebextensions 的更多信息,请点击此处。


推荐阅读