[英]AWS Lambda error message “Unable to import module 'lambda_function': No module named 'lambda_function'”,
[英]AWS lambda Unable to import module 'lambda_function': No module named PIL
我正在使用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
您收到此错误是因为 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 && make
e) sudo make install f sudo /usr/local/bin/pip3 install virtualenv
选择通过 pip3 安装的虚拟环境
/usr/local/bin/virtualenv ~/shrink_venv
源 ~/shrink_venv/bin/activate
在虚拟环境中安装库
pip安装枕头
pip 安装 boto3
将 lib 和 lib64 站点包的内容添加到您的 .zip 文件中。 请注意,以下步骤假设您使用的是 Python 运行时版本 3.6。 如果您使用的是 2.7 版,则需要进行相应的更新。
cd $VIRTUAL_ENV/lib/python3.6/site-packages
zip -r9 ~/CreateThumbnail.zip
注意 - 要包含所有隐藏文件,请使用以下选项:
zip -r9 ~/CreateThumbnail.zip
将您的 python 代码添加到 .zip 文件
光盘~
zip -g 创建缩略图.zip 创建缩略图.py
现在CreateThumbnail.zip是您的自定义部署包,只需将其复制到 s3 并将其上传到您的 lambda。
此示例取自https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html 上的官方 AWS 文档
尽管文档清楚地概述了用于为 lambda 函数手动创建 zip 工件的步骤。 此解决方案的可扩展性不是很强。 我一直在使用一个名为juniper的非常小的包来无缝地打包 python lambda 函数。
在您的特定情况下,这是您需要采取的步骤:
假设这是您的文件夹结构:
.
├── manifest.yml
├── src
│ ├── requirements.txt
│ ├── lambda_function.py
在 requirements.txt 中,您将仅包含 lambda 函数的依赖项,在本例中为 PIL 库。
Pillow==6.0.0
现在,您只需创建一个小文件来告诉瞻博网络要在 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 文件中包含的任何依赖项。
默认情况下,juniper 使用 docker 容器,构建命令将使用 python3.6。 您可以覆盖该默认值。
我也遇到了这个完全相同的问题。 您可以在此处执行两个步骤:手动与自动打包和部署。
手动步骤将涉及创建正确的 virtualenv 并在该虚拟环境中安装依赖项。 然后压缩所有内容并上传到 AWS。
为了自动化,我总是更喜欢使用无服务器框架来打包和部署 Lambda 函数。 特别是 python-requirements-plugin 有助于打包。 但是我必须指定以下内容来告诉框架在 docker 容器中构建并且不要剥离任何库:
custom:
pythonRequirements:
dockerizePip: true
strip: false
正如这里的大多数答案已经提到的那样,AWS Lambda 执行环境仅包含 Python 内置包和 boto3,除此之外不包含其他任何内容。
要包含外部包,您需要自己包含它们,方法是构建它们并将其包含在您的函数上传中——或者将它们打包为层。 还要记住,包本身需要为 Amazon Linux 构建。
如果你使用的是 python3.7,那么你可以使用这个公开可用的枕头层: https : //github.com/keithrozario/Klayers
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.