【发布时间】:2021-03-02 07:59:27
【问题描述】:
我正在将一个烧瓶 (flask-restplus) REST API 部署到一个 AWS Elastic Beanstalk 实例,但我遇到了一种奇怪的故障模式。
我的一个 API 端点依赖于 OpenCV,它需要一些依赖项,如下所述:ImportError: libGL.so.1: cannot open shared object file: No such file or directory while importing OCC。根据那里的答案,我创建了一个 .ebextensions 目录并创建了两个文件,一个用于安装 libGL 包,如下所示:
packages:
yum:
mesa-libGL : []
mesa-libGL-devel : []
如果重要的话,我将该文件保存为 packages.config。
.ebextensions 中的第二个文件下载并安装 zlib:
commands:
00_download_zlib:
command: |
wget https://github.com/madler/zlib/archive/v1.2.9.tar.gz
tar xzvf v1.2.9.tar.gz
cd zlib-1.2.9
./configure
make
make install
ln -fs /usr/local/lib/libz.so.1.2.9 /lib64/libz.so
ln -fs /usr/local/lib/libz.so.1.2.9 /lib64/libz.so.1
我将该文件保存为 zlib.config。
当我第一次运行eb deploy 时,一切正常。部署成功,我的 API 响应了请求,并且依赖于 OpenCV 的代码正常工作。到目前为止一切顺利。
但是,在随后的部署中,我遇到了以下错误:
2020-11-18 23:47:44 ERROR Instance deployment failed. For details, see 'eb-engine.log'.
2020-11-18 23:47:45 ERROR [Instance: i-XXXXXXXXXXXXX] Command failed on instance. Return code: 1 Output: Engine execution has encountered an error..
2020-11-18 23:47:45 INFO Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
2020-11-18 23:47:45 ERROR Unsuccessful command execution on instance id(s) 'i-XXXXXXXXXXXXX'. Aborting the operation.
2020-11-18 23:47:46 ERROR Failed to deploy application.
我进入并从实例中提取日志,首先查看 eb-engine.log。唯一的错误是:
2020/11/18 23:47:44.131837 [ERROR] An error occurred during execution of command [app-deploy] - [PreBuildEbExtension]. Stop running the command. Error: EbExtension build failed. Please refer to /var/log/cfn-init.log for more details.
但是,查看 cfn-init.log 只是表明一切都成功了:
2020-11-18 23:47:34,297 [INFO] -----------------------Starting build-----------------------
2020-11-18 23:47:34,306 [INFO] Running configSets: Infra-EmbeddedPreBuild
2020-11-18 23:47:34,309 [INFO] Running configSet Infra-EmbeddedPreBuild
2020-11-18 23:47:34,313 [INFO] Running config prebuild_0_newapi
2020-11-18 23:47:36,512 [INFO] Running config prebuild_1_newapi
2020-11-18 23:47:44,106 [INFO] Command 00_download_zlib succeeded
2020-11-18 23:47:44,108 [INFO] ConfigSets completed
2020-11-18 23:47:44,108 [INFO] -----------------------Build complete-----------------------
然后我尝试删除整个 .ebextensions 目录并重新部署,部署成功。然后我尝试添加回 .ebextensions 目录并一次添加一个文件,发现添加 packages.config 时部署工作正常,但添加 zlib.config 时再次失败。
我的问题归结为:为什么会发生这种情况,我能做些什么来解决它?我的理解是,我需要将这两个文件都部署到我的实例中,以防我迁移到不同的环境,或者 AutoScaling 迁移我的实例等。
我唯一能想到的是实例不喜欢我不断重新安装zlib的事实,但是cfn-init-cmd.log表明zlib.config中的所有命令都成功了,因为执行cfn-init.log。那么为什么 eb-engine.log 会报错呢?它是否告诉我在错误的位置查找可能相关的日志?我查看了每个日志文件,没有看到任何其他表明任何问题的信息。
我确实找到了一个与Immutable Environment Updates 相关的切线相关的可能解决方案,它看起来可能有效,但感觉像是一些不必要的工作。至少我想了解为什么我需要做出这种改变,以及为什么 Elastic Beanstalk 不能更好地使用我的 .ebextensions。
【问题讨论】:
-
您能否通过 ssh 连接到新的 EB 实例并手动运行命令
00_download_zlib,以查看它们在手动执行时是否按预期工作? -
@Marcin 刚刚尝试过,所有命令都按预期工作。 cfn-init-cmd.log 还表明它们在 EB 部署期间都按预期运行。
-
你试过从zlib.config中取出大部分命令,然后一一放回去吗?同样出于好奇,是否有特别的理由从源代码构建而不是安装其中一个包?
-
@jingx 我还没有尝试一个一个地执行命令,我会在早上尝试一下。我从源代码构建的唯一原因是因为这是原始 question I saw 中的答案,所以我认为他们说从源代码构建是有原因的。
标签: python amazon-web-services opencv amazon-elastic-beanstalk