【问题标题】:Building extensions to AWS Lambda with Continuous Delivery使用持续交付构建 AWS Lambda 扩展
【发布时间】: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


【解决方案1】:

经过相当多的修补后,我想我找到了一些可行的方法。我想我会把它贴在这里以防其他人有同样的问题。

我决定使用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

【讨论】:

    【解决方案2】:

    虽然我很欣赏您可能不想为您的项目增加更多复杂性,但您可能会使用以 Python 为中心的 Lambda 管理工具来设置您的构建和部署,例如 Gordon。您也可以使用此工具从 Travis 中运行的 Amazon Linux Docker 容器内部进行部署。

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

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

    【讨论】:

    • 非常感谢您的帮助 - 我决定选择 Wercker,经过一番修改后,我想出了一个可行的解决方案。我在这里发布它,因为其他人可能会觉得它有帮助。
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2017-11-07
    • 2016-02-22
    • 2019-06-02
    • 1970-01-01
    • 2018-02-28
    相关资源
    最近更新 更多