![](/img/trans.png)
[英]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.