【问题标题】:Lambda-Uploader: Unable to import module 'CreateThumbnail': cannot import name _imagingLambda-Uploader:无法导入模块“CreateThumbnail”:无法导入名称_imaging
【发布时间】:2017-09-07 10:19:41
【问题描述】:

我正在使用 Lambda-uploader 编写 python lambda 代码并将 zip 移动到 AWS。 我创建了一个包含我的 jar 文件和 zip 文件夹结构,如下所示。

我使用的代码来自 AWS 门户,并且正在使用 PIL 类。我将 Pillow 库作为要求包含在 Lambda-uploader 中,但是当我通过导入创建的 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)

【问题讨论】:

标签: python amazon-web-services lambda python-imaging-library


【解决方案1】:

我遇到了完全相同的问题,我解决了。最后是 tl;dr 版本。
_imaging 是一个动态链接的共享对象库(带有 .so 扩展名)。这大致相当于 Linux 的 Windows DLL 模块。您可以在 PIL 文件夹中查看此模块。
问题是这些 .so 文件是针对本地计算机体系结构的编译文件。因此,如果您在 Windows 上执行 pip install Pillow,则无法在任何其他操作系统或架构上使用动态链接库。
AWS lambda 使用 Amazon Linux 执行环境。不是 Ubuntu,亚马逊 Linux。因此,如果您想在 lambda 上使用动态链接的共享对象库,最好的办法是将所有库安装在类似的环境中。值得庆幸的是,EC2 提供了与 lambda 完全相同的执行环境。因此,我分拆了一个临时 EC2 实例。远程通过 SSH/Putty 登录并安装所有依赖项。然后我将它与我自己的代码一起压缩并发布到 lambda。我的程序现在工作正常!

TL;DR

  • 使用 Amazon Linux 执行环境分离 EC2 实例。
  • 通过 SSH/Putty 远程登录来安装 Pillow 等依赖项。
  • 将您自己的代码与库一起压缩并在 Lambda 上发布。

在过程进行到一半时,我遇到了 Matthew Perry 的 nice blog,它解释了整个过程。

【讨论】:

    【解决方案2】:

    您还可以使用以下 PIL 的预编译版本:

    https://github.com/Miserlou/lambda-packages

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

    这不是最优雅的解决方案,但它可以节省您在 EC2 实例上编译的时间。

    【讨论】:

    • 这对我有用。刚刚下载了 .tar.gz,将内容解压缩到我的项目中(不是父文件夹,我将所有 .so 文件和 PIL 文件夹解压缩到我的项目的根目录中),然后将其压缩。它像魅力一样运行。
    【解决方案3】:

    这只是因为我们的本地机器和 AWS lambda 的版本不匹配。

    检查在 aws lambda 和本地机器上运行的 python 版本。如果 python 版本不匹配,请尝试在 AWS lambda 或本地机器上更改版本...

    例如:AWS lambda 中的 python 3.9 和本地计算机中的 python 3.9(根据当前版本,您可以选择您喜欢的任何版本...但我建议您使用最新版本)

    两个版本都应该匹配,然后尝试上传项目的 zip 文件。然后你就可以开始了。

    谢谢

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 2014-10-10
      • 2018-11-17
      • 2021-03-07
      • 2020-03-30
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多