我正在使用SearchFacesbyimage
的lambda函数我正在使用此文档https://aws.amazon.com/blogs/machine-learning/build-your-own-face-recognition-service-using-amazon-rekognition/
我要使用此
进行比较from PIL import Image
我收到了这个错误
Unable to import module 'lambda_function': No module named PIL
答案 0 :(得分:1)
您收到此错误,因为Python 2.x的PIL或3.x的PILLOW不是python lambda环境中可用的标准库。
要使用这样的库,您必须创建所需库的自定义部署包以及要部署的python代码。该软件包可以在 docker 中轻松制作,也可以使用 EC2 实例轻松制作。
以下是如何在 EC2 :
上制作该部署包的过程假设您的文件名为 CreateThumbnail.py
如果您的源代码位于本地主机上,请将其复制到EC2。
scp -i key.pem /path/to/my_code.py ec2-user @ public-ip-address:〜/ CreateThumbnail.py
通过SSH连接到64位Amazon Linux实例。
ssh -i key.pem ec2-user @ public-ip-address
使用以下步骤安装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&&使强>
e) sudo make install f sudo / usr / local / bin / pip3 install virtualenv
选择通过pip3
安装的虚拟环境/ usr / local / bin / virtualenv~ / shrink_venv
来源〜/ shrink_venv / bin / activate
在虚拟环境中安装库
pip install Pillow
pip install boto3
将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
将您的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
答案 1 :(得分:0)
即使文档清楚地概述了用于为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
。执行cli命令:
juni build
杜松将创建:./dist/reko.zip
。该文件将包含您的源代码以及您的requirements.txt文件中包含的所有依赖项。
默认情况下,杜松使用docker容器,而build命令将使用python3.6。您可以覆盖默认设置。
答案 2 :(得分:0)
我也遇到了同样的问题。您可以在此处执行两个步骤:手动打包和自动打包打包。
手动步骤将涉及创建正确的virtualenv并在该虚拟环境中安装依赖项。然后压缩所有内容并上传到AWS。
要使内容自动化,我总是更喜欢使用无服务器框架来打包和部署Lambda函数。特别是python-requirements-plugin有助于打包。但是我必须指定以下内容来告诉框架在docker容器中构建,并且不要剥离任何库:
custom:
pythonRequirements:
dockerizePip: true
strip: false
答案 3 :(得分:0)
正如这里大多数答案已经提到的那样,AWS Lambda执行环境仅包含Python内置包和boto3,而没有其他内容。
要包含外部软件包,您需要自己构建外部软件包,方法是构建外部软件包并将其包含在函数上传中,也可以将它们打包为层。还请记住,这些软件包本身需要针对Amazon Linux构建。
如果您使用的是python3.7,则可以使用此公开可用的枕头层: https://github.com/keithrozario/Klayers