【问题标题】:Elastic Beanstalk deployment failing due to .ebextensions File由于 .ebextensions 文件,Elastic Beanstalk 部署失败
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-21
    • 2015-12-15
    • 2018-11-13
    • 2015-12-17
    • 2017-01-29
    • 2020-08-17
    • 2015-12-30
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多