首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有连续交付的AWS Lambda的扩展

具有连续交付的AWS Lambda的扩展
EN

Stack Overflow用户
提问于 2017-05-07 22:19:31
回答 2查看 428关注 0票数 3

我有一个包含AWS函数的GitHub存储库。我目前正在使用Travis CI来构建、测试并部署此函数到Lambda,如果所有测试都成功地使用

代码语言:javascript
复制
deploy:
    provider: lambda
    (other settings here)

我的函数在其requirements.txt中指定了以下依赖项

代码语言:javascript
复制
Algorithmia
numpy
networkx
opencv-python

我已经使用下面的命令将Travis CI的构建脚本设置为在工作目录中构建,以便将依赖项正确地复制到我的AWS Lambda函数中。

pip install --target=$TRAVIS_BUILD_DIR -r requirements.txt

问题是,虽然Travis CI中的构建成功,并且一切都成功地部署到Lambda函数中,但是测试我的Lambda函数会导致以下错误:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-11 16:36:54

经过一番修修补补,我想我找到了一些有用的东西。我想我应该把它张贴在这里,以防其他人有同样的问题。

我决定使用威克,因为它们有一个非常慷慨的免费层,并且允许您为您的构建定制坞映像。

原来,已经创建了一个坞映像来复制Lambda函数所执行的精确环境!请参阅:https://github.com/lambci/docker-lambda在这个停靠容器中运行您的构建时,扩展将被正确构建,以便它们能够在Lambda上成功地执行。

如果有人想使用Wercker,下面是我使用的wercker.yml,它作为模板可能会有帮助:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2017-05-09 02:17:51

虽然我理解您可能不想给您的项目增加更多的复杂性,但是您可能会使用一个专注于Python的Lambda管理工具来设置您的构建和部署,比如戈登。您也可以使用这个工具从在Travis中运行的容器中进行部署。

如果您希望更改CI提供程序,CodeShip允许您使用您选择的任何Docker容器进行构建,然后使用部署到Lambda

威克还运行基于完整Docker的构建,并有许多用户提交的部署“步骤”,其中一些是支持部署到Lambda

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43837305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档