amazon-web-services - 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 应用程序都在使用静态路径读取文件,将其迁移到从存储桶中读取将是一项巨大的工作。
解决方案
我有一段时间遇到同样的问题,最后在 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 的更多信息,请点击此处。
推荐阅读
- javascript - 无法在来自 php 文件的 js ajax 请求中接收 json
- java - 如何在 JCIFS 中解压缩 zip 文件
- android - React Native - 如何使用抽屉导航管理本机后退按钮
- javascript - 使标记弹出
- javascript - 有没有办法对网站上的每个页面进行截图?
- python - 无法从 Docker 容器中的应用程序中检索图像
- java - NullPointer 在我的方法中随机且无法解释
- unity3d - 将连续着色器应用于纹理,同时保持浮动精度
- python - 如何在单词和标点符号上拆分字符串
- scala - 错误图 X 引起:java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V