我使用Lambda-uploader编写python lambda代码并将zip移动到AWS。 我创建了一个包含我的jar文件和zip文件夹结构,如下所示。
我正在使用的代码来自AWS门户,并且正在使用PIL类。我在Lambda-uploader中包含了Pillow库作为一项要求,但是当我通过导入创建的zip文件在Lambda控制台上创建我的Lambda函数时,我收到以下错误消息。任何帮助表示赞赏。
错误:
START RequestId: e4893543-93aa-11e7-b4b9-89453f1042aa Version: $LATEST
Unable to import module 'CreateThumbnail': cannot import name _imaging
END RequestId: e4893543-93aa-11e7-b4b9-89453f1042aa
REPORT RequestId: e4893543-93aa-11e7-b4b9-89453f1042aa Duration: 0.44 ms Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 33 MB
lambda.josn
{
"name": "CreateThumbnail",
"description": "It does things",
"region": "us-east-1",
"runtime": "python2.7",
"handler": "CreateThumbnail.lambda_handler",
"role": "arn:aws:iam::0000000000:role/LambdaTest",
"requirements": ["Pillow"],
"ignore": [
"circle\\.yml$",
"\\.git$",
"/.*\\.pyc$"
],
"timeout": 30,
"memory": 512
}
python代码:
from __future__ import print_function
import boto3
import os
import sys
import uuid
from PIL import Image
import PIL.Image
s3_client = boto3.client('s3')
def resize_image(image_path, resized_path):
with Image.open(image_path) as image:
image.thumbnail(tuple(x / 2 for x in image.size))
image.save(resized_path)
def handler(event, context):
for record in event['Records']:
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
upload_path = '/tmp/resized-{}'.format(key)
s3_client.download_file(bucket, key, download_path)
resize_image(download_path, upload_path)
s3_client.upload_file(upload_path, '{}resized'.format(bucket), key)
答案 0 :(得分:7)
我有完全相同的问题,我解决了它。最后的tl; dr版本。
_imaging是一个动态链接的共享对象库(扩展名为.so)。这大致相当于Windows DLL模块的Linux。您可以在PIL文件夹中查看此模块
问题是这些.so文件是针对本地机器架构的编译文件。因此,如果您在Windows上安装Pillow,则动态链接库不能用于任何其他操作系统或体系结构
AWS lambda使用Amazon Linux 执行环境。不是Ubuntu,亚马逊Linux。因此,如果您想在lambda上使用动态链接的共享对象库,最好的办法是在类似的环境中安装所有库。值得庆幸的是,EC2提供了与lambda完全相同的执行环境。所以,我剥离了一个临时的EC2实例。通过SSH / Putty远程登录并安装所有依赖项。然后我将它与我自己的代码一起压缩并将其发布到lambda。我的程序现在运行正常!
<强> TL; DR 强>
在整个过程的一半时间里,我遇到了马修佩里解释整个过程的nice blog。
答案 1 :(得分:2)
您还可以使用PIL的预编译版本:
https://github.com/Miserlou/lambda-packages
只需将PIL文件夹解压缩到部署包,它就可以正常工作。
这不是最优雅的解决方案,但它可以节省您在EC2实例上编译的麻烦。