获取 PIL/Pillow 4.2.1 以正确上传到 AWS Lambda Py3.6

Getting PIL/Pillow 4.2.1 to upload properly to AWS Lambda Py3.6

背景

过去几天我一直在努力部署一个使用 Pillow 的 Lambda,我正在使用 Python 3.6 进行部署。值得注意的是,我正在 Windows 10 环境中开发它。

第一次尝试

我首先通过执行以下操作让 pip 在我的工作区中严格安装我的包:

pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\pillow"

我还有其他软件包,并尝试将这些软件包安装在同一个庄园中,其中之一是 praw,我是通过以下方式安装的:

pip3 install praw -t "D:\Work and Projects\...\...\<projectdir>\praw"

将我的项目内容压缩在一起后,我将我的包上传到 Lambda,在第一次测试时我收到了错误:

Unable to import module 'motw_lambda': cannot import name '_imaging'

然后我删除了 Pillow 包,试图查看此问题的根源(Pillow 或 praw 或其他包之一)。移除 Pillow 后,执行成功。然后我删除了包中的 pillow 包并尝试:

pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\PIL"

pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\Pillow"

但是包 '_imaging' 出现了同样的错误。

进一步尝试

然后我按照 and this. I also tried using virualenv and even lambda-uploader 的指示进行操作。

很奇怪,我得到了同样的错误!我在这里没有选择,觉得我在做一些愚蠢的事情,或者这在 Lambda 上是不可能的- Python3.6 目前(虽然我无法想象其他人 还没有 在 py3.6-lambda 中使用枕头...)

如有任何信息、帮助或通用资源,我们将不胜感激!

基本上,您必须使用 Docker 或更好的 EC2 实例来编译库(例如 PIL)。

  1. 像这样启动一个 Docker 容器:docker run --rm -it -v "%cd%:/code" lambci/lambda:build-python3.6 sh

  2. 在那里,导航到 /code 目录 (cd /code),创建一个 virtualenv (virtualenv env),激活它 (source env/bin/activate),最后,安装你的库(pip install pillow)。

  3. 一旦你安装了你的库,你就可以退出容器。这里的秘诀是将您的包库移动到根文件夹(您的主要 .py 文件所在的位置)。例如,将文件夹 env/lib/python3.6/site-packages/PIL 移动到根目录。

然后,将 PIL 文件夹与 .py 文件一起压缩,大功告成!

完整示例:

以下示例将 PIL 和其他常见 Python 库编译并压缩为 AWS Lambda 中的 运行。

Docker文件:

FROM lambci/lambda:build-python3.6
WORKDIR /code
CMD ["sh", "entrypoint.sh"]

entrypoint.sh:

#!/bin/sh

set -ex

cd /code/

if [ ! -d "PIL" ]; then
    # Create virtual env, activate it and install PIL
    virtualenv env && source env/bin/activate && pip install pillow requests

    # Copy necessary files to the root folder
    rm -f build-output.zip
    #mkdir PIL
    cp -f -r env/lib/python3.6/site-packages/PIL .
    cp -f -r env/lib/python3.6/site-packages/requests .
    
    # below are the dependencies for the requests pkg
    cp -f -r env/lib/python3.6/site-packages/urllib3 .
    cp -f -r env/lib/python3.6/site-packages/certifi .
    cp -f -r env/lib/python3.6/site-packages/chardet .
    cp -f -r env/lib/python3.6/site-packages/idna .
    
    # Remove temp files
    rm -r env
fi

# ZIP it
zip -9 build-output *.py 
zip -9 -r build-output PIL
zip -9 -r build-output requests
zip -9 -r build-output urllib3
zip -9 -r build-output certifi
zip -9 -r build-output chardet
zip -9 -r build-output idna

构建(Windows):

docker build -t build_lambda .
docker run --rm -v "%cd%:/code" build_lambda

您可以使用此处提供的预编译版本的 PIL: https://github.com/Miserlou/lambda-packages

只需将 PIL 文件夹解压到部署包中即可。

对于其他刚接触 aws python 和 运行 的人来说,您可以使用层功能,这里有现有的层,您可以 link 和这个为我工作。

https://github.com/keithrozario/Klayers

us-east-1 上的枕头:

arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-Pillow:2