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

AWS Lambda Hanging Indefinitely when making thumbnails of jpg files

我遵循 this example 并稍作修改,但它在很长一段时间内都运行良好。我一直只使用 PNG 文件作为输入,一切正常。我最近尝试切换为使用 JPG 图像(由于 PNG 图像在 vert/horizontal 方向上的一些限制)作为输入,并且我已经从 AWS CLI invoke 测试了 lambda 函数并且它有效.

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

此外,使用 PNG 文件时一切正常,所以它似乎支持 jpg。我以为是我安装了不支持 jpeg 的 PIL,但我已经对其进行了调试,并使用已安装的 lambda 函数和 AWS invoke 对 jpg 图像进行了测试。这让我发疯,因为所有测试都有效,只是在生产中请求 "dies silently" 让我无法排除故障。

这是 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 主图像的名称,并创建了缩略图和然后浏览器中的网络请求突然完成并响应。好奇怪的问题。

关闭

对于所有阅读本文的人 post,我已经确定了问题所在,就像 John Rotenstein 在他的评论中建议的那样,我检查了触发 Lambda 函数的 S3 事件,它我有点忘记了。我最初将其设置为仅触发 png 文件。所以这就是整个问题所在。解释 CloudWatch 中没有日志的原因。

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

如果他们没有显示函数的调用,那么这就是您需要调查的地方。检查您是否已打开 S3 触发器的 "Enable trigger" 并且 事件类型 Object Created (All).