AWS Lambda无法导入模块'lambda_function': 没有名为PIL的模块。

6

我正在使用一个名为SearchFacesbyimage的lambda函数,并且参考了这篇文档:https://aws.amazon.com/blogs/machine-learning/build-your-own-face-recognition-service-using-amazon-rekognition/

用于比较的是以下内容:

from PIL import Image

我遇到了这个错误:无法导入模块'lambda_function':没有名为PIL的模块


你是否安装了所有依赖项,将其压缩为.zip文件,然后上传到Lambda? - Manoj Acharya
@ManojAcharya 我尝试搜索,但没有找到解决方案。你能指导我在哪里安装吗?我没有在本地运行它。 - ephemeral
请参考此链接:https://dev59.com/sqvka4cB1Zd3GeqP1PIo#50723859?noredirect=1#comment88471390_50723859 - Manoj Acharya
谢谢您的回复。您能告诉我lambda_function.py会有什么内容吗?因为我的Lambda函数是ImageComp.py,所以我需要更改哪些内容? - ephemeral
第二个问题是,我如何直接将zip文件上传到Lambda? - ephemeral
显示剩余3条评论
4个回答

2
尽管文档清楚地概述了手动创建 Lambda 函数的 zip 文件的步骤。但是,这种解决方案并不非常可扩展。我一直在使用一个非常小的软件包 juniper 来无缝地打包 Python Lambda 函数。
对于您的特定情况,您需要执行以下步骤:
假设这是您的文件夹结构:
.
├── manifest.yml
├── src
│   ├── requirements.txt
│   ├── lambda_function.py

在 requirements.txt 文件中,您只需要包含 Lambda 函数所依赖的库,例如 PIL 库。
Pillow==6.0.0

现在,您只需要创建一个小文件告诉Juniper应该在zip文件中包含什么。manifest.yml应该如下所示:
functions:
  reko:
    requirements: ./src/requirements.txt.
    include:
    - ./src/lambda_function.py

现在您需要在本地环境中执行 pip install juniper 命令。执行以下命令行命令:juni build。Juniper 将创建名为 ./dist/reko.zip 的文件,其中包含您的源代码以及您在 requirements.txt 文件中包含的任何依赖项。默认情况下,Juniper 使用 Docker 容器,并且构建命令将使用 Python 3.6。您可以覆盖此默认设置。

这需要一点时间来设置,但是现在运行得很好。使用python3.7+,您只需添加一个额外的参数,参见:https://github.com/eabglobal/juniper#python37-and-beyond - getup8
./src/requirements.txt上有一个拼写错误。行尾不应该有一个点。应该只是./src/requirements.txt - josealvarez97

1
您之所以会遇到此错误,是因为Python 2.x的PIL或3.x的PILLOW不是Python Lambda环境中的标准库。如果要使用这样的库,您必须制作一个自定义部署包,其中包括您需要的所有库和要部署的Python代码。您可以轻松地在docker或使用EC2实例中创建此包。以下是在EC2上制作部署包的步骤:
  1. 假设你的文件名为CreateThumbnail.py

  2. 如果你的源代码在本地主机上,请将其复制到EC2上。

    scp -i key.pem /path/to/my_code.py ec2-user@public-ip-address:~/CreateThumbnail.py

  3. 通过SSH连接到64位Amazon Linux实例。

    ssh -i key.pem ec2-user@public-ip-address

  4. 使用以下步骤安装Python 3.6和virtualenv:

    a) sudo yum install -y gcc zlib zlib-devel openssl openssl-devel

    b) wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

    c) tar -xzvf Python-3.6.1.tgz

    d) cd Python-3.6.1 && ./configure && make

    e) sudo make installfsudo /usr/local/bin/pip3 install virtualenv

  5. 选择通过pip3安装的虚拟环境

    /usr/local/bin/virtualenv ~/shrink_venv

    source ~/shrink_venv/bin/activate

  6. 在虚拟环境中安装库

    pip install Pillow

    pip install boto3

  7. 将lib和lib64 site-packages的内容添加到您的.zip文件中。请注意,以下步骤假定您使用了Python运行时版本3.6。如果您使用的是版本2.7,则需要相应更新。

    cd $VIRTUAL_ENV/lib/python3.6/site-packages

    zip -r9 ~/CreateThumbnail.zip

    注意- 要包括所有隐藏文件,请使用以下选项:

    zip -r9 ~/CreateThumbnail.zip

  8. 将你的python代码添加到.zip文件中

    cd ~

    zip -g CreateThumbnail.zip CreateThumbnail.py

现在,CreateThumbnail.zip 是您的自定义部署包,只需将其复制到s3并上传到lambda即可。 此示例摘自AWS官方文档,链接为 https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html

CreateThumbnail.py 是 Lambda 函数吗? - ephemeral
1
你可以给它任何名称,但始终以这种方式配置处理程序 filename.handler-function,例如 disco.lambda_handler,其中 disco.py 是文件名,lambda_handler 是用于 Lambda 的代码处理程序模块。 - Mausam Sharma
这些第四步的安装是在本地机器上还是EC2上? - ephemeral
安装需要在EC2上完成,从本地机器只需要将您的Python代码复制到Ec2即可。 - Mausam Sharma
1
仍然无法导入模块'lambda_function':无法导入名称'_imaging' :| - ephemeral
这是从https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html直接复制粘贴的内容。 - Songtham T.

1
我遇到了完全相同的问题。你可以采用两种方法来解决这个问题:手动打包和部署,或自动化打包和部署。
手动打包需要创建正确的虚拟环境并在该虚拟环境中安装所需依赖项。然后将所有内容压缩,并上传到AWS。
为了自动化处理,我通常使用Serverless框架来打包和部署Lambda函数。特别是python-requirements-plugin有助于打包。但我必须指定以下内容,以告诉框架在Docker容器内构建并不删除任何库:
custom:
  pythonRequirements:
    dockerizePip: true
    strip: false

0

正如这里的大多数答案已经提到的那样,AWS Lambda执行环境仅包括Python内置包和boto3,但没有其他内容。

要包含外部包,您需要自己包含它们,可以通过构建它们并将其包含在函数上传中--或者将它们打包为层。还要记住,这些包本身需要为Amazon Linux构建。

如果您正在使用python3.7,则可以使用此公开可用的pillow层: https://github.com/keithrozario/Klayers


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接