AWS Lambda的建筑扩建,连续交付

2024-05-15 03:08:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

deploy:
    provider: lambda
    (other settings here)

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

^{pr2}$

我使用下面的命令将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是在travisci使用的linux的Ubuntu发行版中构建的,但是它作为Lambda函数运行的Amazon linux无法正常运行。有许多论坛帖子和博客文章,如this详细说明,需要在EC2实例上构建需要构建C/C++扩展的Python模块。在

我的问题是:这是一个真正的麻烦,必须增加另一个复杂的CD管道,必须搞乱EC2实例。Amazon有没有想出更好的方法来实现这一点(因为确实应该有更好的方法来做到这一点),还是有某种方法可以在Travis CI或其他CI解决方案中正确编译所有内容?在

另外,我想有可能是我误认了问题所在,还有其他原因导致进口纽比失败。如果有人对如何解决这个问题提出建议,那就太好了!在


编辑:根据@jordann的建议,在运行TravisCI时,可以使用amazonlinux映像加载docker容器,然后在该容器中执行构建和测试。不幸的是,虽然这肯定比使用EC2更容易——我不认为我可以在TravisCI中使用普通的lambda部署工具——但我必须使用awscli编写自己的部署脚本,这有点麻烦。还有什么其他的想法或者方法可以让这个过程更顺利吗?理想情况下,我会指定我的构建在TravisCI中运行的docker映像,因为它们的默认构建环境已经在使用docker……但是它们似乎还不支持该功能:https://github.com/travis-ci/travis-ci/issues/7726


Tags: 方法lambda函数dockernumpytxt脚本travis
2条回答

虽然我很感激您可能不想给您的项目增加更多的复杂性,但是您可以使用一个以Python为中心的Lambda管理工具来设置构建和部署,比如Gordon。您也可以使用这个工具在Travis中运行的amazonluxdocker容器中进行部署。在

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

Wercker还运行完整的基于Docker的构建,并有许多用户提交的部署“步骤”,其中一些步骤support deployment to Lambda。在

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

我决定使用Wercker,因为它们有相当大的免费层,并且允许您为您的构建定制docker映像。在

原来有一个docker镜像被创建来复制执行Lambda函数的环境!请参见:https://github.com/lambci/docker-lambda在这个docker容器中运行构建时,将正确构建扩展,以便它们可以在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

相关问题 更多 >

    热门问题