我有一个包含 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/