我有一个包含AWS函数的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使用的linux的Ubuntu发行版中构建的,但是它在作为Lambda函数执行时运行的Amazon无法正确运行它。有许多论坛文章和博客文章,如这 one,详细说明需要构建C/C++扩展的python模块必须构建在EC2实例上。
我的问题是:这是一个真正的麻烦,必须增加另一个复杂的CD管道,并必须混乱的EC2实例。亚马逊是否想出了更好的方法来做到这一点(因为确实应该有更好的方法来做到这一点),还是有什么方法可以在Travis CI或其他CI解决方案中正确地编译所有内容?
而且,我认为我可能已经错误地识别了这个问题,并且还有其他原因导致numpy的导入失败。如果有人对如何解决这个问题有建议,那就太好了!
编辑:,正如@jordanm所建议的,在运行TravisCI时,可能有可能加载带有amazonlinux映像的停靠容器,然后在该容器中执行构建和测试。不幸的是,虽然这肯定比使用EC2容易--我认为我不能在TravisCI中使用普通的lambda部署工具--但我必须使用aws编写自己的部署脚本,这有点麻烦。还有其他的想法--或者让这件事变得更顺利的方法吗?理想情况下,我将指定构建在TravisCI中运行的停靠映像,因为他们的默认构建环境已经在使用docker...but,他们似乎还不支持该功能:https://github.com/travis-ci/travis-ci/issues/7726
发布于 2017-05-11 16:36:54
经过一番修修补补,我想我找到了一些有用的东西。我想我应该把它张贴在这里,以防其他人有同样的问题。
我决定使用威克,因为它们有一个非常慷慨的免费层,并且允许您为您的构建定制坞映像。
原来,已经创建了一个坞映像来复制Lambda函数所执行的精确环境!请参阅:https://github.com/lambci/docker-lambda在这个停靠容器中运行您的构建时,扩展将被正确构建,以便它们能够在Lambda上成功地执行。
如果有人想使用Wercker,下面是我使用的wercker.yml,它作为模板可能会有帮助:
box: lambci/lambda:build-python3.6
build:
steps:
- script:
name: Install Dependencies
code: |
pip install --target=$WERCKER_SOURCE_DIR -r requirements.txt
pip install pytest
- script:
name: Test code
code: pytest
- script:
name: Cleaning up
code: find $WERCKER_SOURCE_DIR \( -name \*.pyc -o -name \*.pyo -o -name __pycache__ \) -prune -exec rm -rf {} +
- script:
name: Create ZIP
code: |
cd $WERCKER_SOURCE_DIR
zip -r $WERCKER_ROOT/lambda_deploy.zip . -x *.git*
deploy:
box: golang:latest
steps:
- arjen/lambda:
access_key: $AWS_ACCESS_KEY
secret_key: $AWS_SECRET_KEY
function_name: yourFunction
region: us-west-1
filepath: $WERCKER_ROOT/lambda_deploy.zip发布于 2017-05-09 02:17:51
虽然我理解您可能不想给您的项目增加更多的复杂性,但是您可能会使用一个专注于Python的Lambda管理工具来设置您的构建和部署,比如戈登。您也可以使用这个工具从在Travis中运行的容器中进行部署。
如果您希望更改CI提供程序,CodeShip允许您使用您选择的任何Docker容器进行构建,然后使用部署到Lambda。
威克还运行基于完整Docker的构建,并有许多用户提交的部署“步骤”,其中一些是支持部署到Lambda。
https://stackoverflow.com/questions/43837305
复制相似问题