AWS lambda在python中构建外部依赖库

时间:2017-07-19 01:12:10

标签: python amazon-web-services numpy lambda scikit-learn

我正在尝试使用Python创建AWS lambda函数。我想要创建一个zip部署包,然后在我的AWS环境中上传它,而不是内联函数。我的源代码在test.py文件中,其他依赖项如numpy,sklearn等与我的源代码在同一个文件夹中。

我在测试lambda函数时遇到错误。

  

无法导入模块'测试':没有命名的模块   ' sklearn .__ check_build._check_build'   ___________________________________________________________________________ / var / task / sklearn / __ check_build的内容:setup.py
  __pycache__ _check_build.cp36-win_amd64.pyd   __init__.py   ___________________________________________________________________________似乎scikit-learn还没有正确构建。如果你有   安装scikit-从源头学习,请不要忘记构建   在使用之前打包:运行python setup.py installmake   源目录。如果您使用过安装程序,请检查   它适用于您的Python版本,操作系统和您的   平台。

这是我的python源代码,它位于test.py

from sklearn.model_selection import train_test_split
print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 is " + event['key1'])
    print("value2 is " + event['key2'])
    print("value3 is " + event['key3']) 
    return event

如果我在源代码中导入numpy,我将遇到类似的问题。 (无法导入多阵列)

我使用pip install numpy/scikit-learn -t /path/to/mydir/安装每个库。

Here is the folder structure after I use pip install commands

请帮我解决问题。谢谢!!

1 个答案:

答案 0 :(得分:4)

这里可能存在两个问题:

  1. 需要在具有与Lambda函数运行的架构(即Linux)相同的架构的机器上构建具有C绑定的Python包(<{1}}
  2. 使用AWS Lambda,您负责管理Python的路径,以便它可以找到您的依赖项。您可能需要在运行时更新路径。
  3. 要解决#1,我使用官方的Python Docker镜像。

    pip install

    现在,每当您执行docker run --rm -it \ -v `pwd`:/code \ python:2 bash 之类的操作时,您都会获得正确的pip install -t lib numpy个文件。这里的技巧是使用volume参数(.so),这样当你在-v目录下关闭容器的时候就会保留在你的主机上。

    要解决2,我总是这样构建我的无服务器/ lambda项目:

    lib

    也就是说,我的所有依赖关系都在$ tree -L 2 . ├── handler.py ├── lib │   └── numpy └── serverless.yml 内。

    lib

    pip install -t lib numpy 的顶部,我总是有这4行:

    handler.py

    import os import sys CWD = os.path.dirname(os.path.realpath(__file__)) sys.path.insert(0, os.path.join(CWD, "lib")) # now it's ok to import extra libraries import numpy as np 之后,您的软件包的所有导入都将有效。