python - 使用持续交付构建 AWS Lambda 的扩展

标签 python amazon-web-services numpy aws-lambda travis-ci

我有一个包含 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 使用的 Linux 的 Ubuntu 发行版中构建的,但是作为 Lambda 函数执行时它运行的 Amazon Linux 无法运行它适本地。有许多论坛帖子和博客帖子,例如 this一个详细说明需要构建 C/C++ 扩展的 python 模块必须构建在 EC2 实例上。

我的问题是:这是一个真正的麻烦,必须向 CD 管道添加另一个复杂的功能,并且必须与 EC2 实例打交道。 Amazon 是否想出了更好的方法来做到这一点(因为确实应该有更好的方法来做到这一点)或者是否有某种方法可以在 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

最佳答案

经过相当多的修改后,我想我找到了一些有用的东西。我想我会把它张贴在这里,以防其他人遇到同样的问题。

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

关于python - 使用持续交付构建 AWS Lambda 的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43837305/

相关文章:

AWS RDS 上的 Mysql 模式显示数据库元数据中不可用的表(information_schema)

python - 尝试在 Python 中插入直方图函数的输出

python - org.apache.spark.SparkException : Python worker exited unexpectedly (crashed)

python:在 easy_install 期间会发生什么?

python - 如何在 MAC 上用 python 打开 Excel 实例?

linux - 如何在没有 PEM key 的情况下通过 ssh 进入 EC2 实例?

python - 如何提高HDF5读取数据的性能?

mysql - 尝试增加 RDS MySQL 实例上的存储时出错

python - 来自另一个数据集的两个日期的语句之间的 Pandas

python - 在python中选择满足条件的索引