AWS Lambda在制作jpg文件的缩略图时无限期悬挂

时间:2017-02-19 08:31:18

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

我跟着this example并稍微改了一下,但现在已经很好地工作了很长时间。我一直在使用PNG文件作为输入,一切都在工作。我最近尝试切换到使用JPG图像(由于PNG图像的一些限制,直到垂直/水平方向)作为输入,我已经从AWS CLI invoke测试了lambda函数并且它可以工作。 / p>

当我尝试从网站(jpg)上传相同的测试文件时,s3请求无限期挂起,让客户端在没有s3响应的情况下旋转。我可以看到原始文件已成功上传到主存储区,但从未创建缩略图,并且 CloudWatch Log中未记录任何记录。同样,使用invoke函数进行测试会返回代码202并成功创建缩略图。所以我真的很茫然。

使用PNG文件时一切正常,所以它似乎是jpg支持的东西。我曾经假设我已经安装了没有jpeg支持的PIL但是我已经调试了它并使用安装的lambda函数和AWS invoke使用jpg图像进行了测试。它让我发疯,因为所有测试都有效,只是在生产中,请求“无声地死”,让我无法排除故障。

这是lambda函数:

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, resized_width):
    with Image.open(image_path) as image:
        if image.size[0] > resized_width:
            image.thumbnail((resized_width, image.size[1]/(image.size[0]/resized_width)))
        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_small = '/tmp/resized_small-{}'.format(key)
        upload_path_medium = '/tmp/resized_medium-{}'.format(key)

        s3_client.download_file(bucket, key, download_path)
        resize_image(download_path, upload_path_small, 600)
        resize_image(download_path, upload_path_medium, 1200)
        s3_client.upload_file(upload_path_small, '{}small'.format(bucket), key)
        s3_client.upload_file(upload_path_medium, '{}medium'.format(bucket), key)

无论如何我明白,对于那里的任何人来说,这个问题很难解决,但是如果有人有任何建议会非常感激。谢谢!

更新

因此,当请求挂在浏览器中时,我将AWS CLI中手动invoke函数的输入编辑为新上传的jpg主图像的名称,并创建了缩略图然后浏览器中的Web请求突然完成并响应。这么奇怪的问题。

CLOSURE

对于那些能够阅读完整篇文章的所有人,我已经确定了问题,就像John Rotenstein在评论中所推荐的那样,我检查了触发Lambda函数的S3事件,我有点忘记了。我最初设置它只是为了触发png文件。那就是整个问题就在那里。解释为什么CloudWatch中没有登录。

1 个答案:

答案 0 :(得分:1)

首先要确认的是Amazon S3是否正确触发了Lambda功能。如果是这样,您应该看到它显示在Lambda控制台的监控选项卡和CloudWatch Logs中。

如果他们没有显示函数的调用,那么这是您需要调查的地方。检查你有"启用触发器"启用S​​3触发器并且事件类型Object Created (All)