由于.eextensions文件,弹性Beanstalk部署失败



我正在将一个flask(flask-restplus(REST API部署到AWS Elastic Beanstalk实例,我正进入一个奇怪的失败模式。

我的一个API端点对OpenCV有依赖关系,这需要一些依赖关系,如ImportError:libGL.so.1:无法打开共享对象文件:导入OCC时没有这样的文件或目录。根据那里的答案,我创建了一个.eextensions目录,并创建了两个文件,其中一个用于安装libGL包,如下所示:

packages:
yum:
mesa-libGL : []
mesa-libGL-devel : []

我把那个文件保存为packages.config,如果这很重要的话。

.eextensions中的第二个文件下载并安装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.

我进去查看了实例中的日志,首先查看了ebengine.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-----------------------

然后,我尝试删除整个.eextensions目录并重新部署,部署成功了。然后,我尝试添加回.eextensions目录并一次添加一个文件,发现添加packages.config时部署工作正常,但添加zlib.config时再次失败。

我的问题归结为:为什么会发生这种情况,我能做些什么来解决它吗?我的理解是,我需要将这两个文件部署到我的实例中,以防我迁移到不同的环境,或者AutoScaling迁移我的实例,等等。

我唯一能想到的是,该实例不喜欢我一直在重新安装zlib,但cfn-init-cmd.log表明zlib.config中的所有命令都在成功,cfn-init.log也是如此。那么,为什么ebengine.log会报告错误呢?它是在告诉我在错误的地方寻找可能相关的日志吗?我查看了每个日志文件,没有发现任何其他问题。

我确实找到了一个与不可变环境更新相关的可能解决方案,它看起来可能有效,但感觉有点不必要。至少我想了解为什么我需要做出这样的改变,以及为什么Elastic Beanstalk在我的.eextensions.上玩得不好

为了防止将来有人遇到这种情况,我想分享这个解决方案。我一直无法确定zlib安装过程在实例上第一次部署后失败的原因,所以我最终使用了我在最初的问题中链接的Immutable Environment Updates设置。

部署需要更长的时间来处理,因为部署会在每个部署上创建一个自动缩放组和一个新实例,但我的部署现在每次都能工作。

最新更新