【发布时间】:2017-05-12 09:15:14
【问题描述】:
我有一个包含 AWS Lambda 函数的 GitHub 存储库。如果所有测试都使用成功,我目前正在使用 Travis CI 构建、测试然后将此函数部署到 Lambda
deploy:
provider: lambda
(other settings here)
我的函数在其requirements.txt 中指定了以下依赖项
Algorithmia
numpy
networkx
opencv-python
我已将 Travis CI 的构建脚本设置为使用以下命令在工作目录中构建,以便将依赖项正确复制到我的 AWS Lambda 函数中。
pip install --target=$TRAVIS_BUILD_DIR -r requirements.txt
问题是,虽然 Travis CI 中的构建成功并且所有内容都成功部署到 Lambda 函数,但测试我的 Lambda 函数会导致以下错误:
Unable to import module 'mymodule':
Importing the multiarray numpy extension module failed. Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control). Otherwise reinstall numpy.
对于为什么会发生这种情况,我最好的猜测是 numpy 是在 Travis CI 使用的 Ubuntu 发行版中构建的,但是在作为 Lambda 函数执行时运行的 Amazon Linux 无法运行它适当地。有许多论坛帖子和博客帖子,例如 this,其中详细说明了需要构建 C/C++ 扩展的 Python 模块必须构建在 EC2 实例上。
我的问题是:必须向 CD 管道添加另一个复杂功能并且必须弄乱 EC2 实例,这确实很麻烦。亚马逊是否想出了一些更好的方法来做到这一点(因为确实应该有更好的方法来做到这一点)或者有什么方法可以在 Travis CI 或其他 CI 解决方案中正确编译所有内容?
另外,我想我可能错误地识别了问题,并且导入 numpy 失败还有其他一些原因。如果有人对如何解决这个问题有任何建议,那就太好了!
编辑:正如@jordanm 所建议的那样,看起来可以在运行 TravisCI 时使用 amazonlinux 映像加载 docker 容器,然后在该容器中执行我的构建和测试。不幸的是,虽然这肯定比使用 EC2 更容易——我认为我不能在 TravisCI 中使用普通的 lambda 部署工具——我将不得不使用 aws cli 编写我自己的部署脚本,这有点痛苦。还有其他想法 - 或使这更顺畅的方法吗?理想情况下,我会指定我的构建在 TravisCI 中运行的 docker 映像,因为他们的默认构建环境已经在使用 docker……但他们似乎还不支持该功能:https://github.com/travis-ci/travis-ci/issues/7726
【问题讨论】:
-
您可以在 amazon linux docker 容器中进行构建。
-
这听起来很有趣——用 TravisCI 能做到吗?
-
@jordanm 查看我对原帖的编辑。
-
看起来你实际上并没有在 docker 中进行构建,只是拉取图像
标签: python amazon-web-services numpy aws-lambda travis-ci