Я следовал за this example и немного изменил его, но он работал очень хорошо уже долгое время. Я использовал исключительно файлы PNG в качестве входных данных, и все работало. Недавно я попытался переключиться на использование изображений JPG (из-за некоторых ограничений изображений PNG до вертикальной/горизонтальной ориентации), и я проверил функцию лямбда от AWS CLI invoke
, и он работает.AWS Lambda Hanging Неопределенно при создании миниатюр файлов jpg
Когда я пытаюсь загрузить тот же файл теста с веб-сайта (jpg), запрос s3 зависает бесконечно, оставляя клиент вращаться без ответа от s3. Я вижу, что исходный файл загружен в основное ведро успешно, но миниатюры никогда не создаются, и запись в журнал CloudWatch не записывается. Опять же, тестирование с использованием функции invoke
возвращает код 202 и успешно создает миниатюры. Так что я действительно в растерянности.
Также все работает отлично при использовании файлов PNG, поэтому кажется, что-то с поддержкой jpg. Я предположил, что я установил PIL без поддержки jpeg, но я отлаживал это и тестировал с помощью jpg-изображений, используя установленную лямбда-функцию и AWS invoke
. Это сводит меня с ума, потому что все тесты работают, только в процессе производства запрос «тихо умирает», и я не могу устранить неисправность.
Вот функция лямбда:
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)
В любом случае я понимаю, что этот вопрос будет трудно для кого-то там, чтобы устранить неисправность для меня, но если у кого есть какие-либо предложения, которые были бы весьма признателен. Благодаря!
UPDATE
Таким образом, хотя запрос был висит в браузере, я редактировал вход ручного invoke
функции от AWS CLI на имя вновь загруженном JPG основного изображения, и что создало миниатюр, а затем веб-запрос в браузере неожиданно завершил и ответил. Такая странная проблема.
ЗАКРЫТИЕ
Для всех вас, кто был достаточно хорош, чтобы прочитать весь этот пост, я определил проблему, так же, как Джон Rotenstein рекомендовал в своем комментарии, я проверил событие S3, который запускает функцию лямбда , о котором я забыл. Я изначально установил его только для запуска для png-файлов. Так вот, вся проблема. Объясняет, почему в CloudWatch не было журнала.
Первое, что нужно подтвердить, - правильно ли запустить Amazon S3 функцию лямбда. Если это так, вы должны увидеть его на вкладке «Мониторинг» консоли Lambda и в журналах CloudWatch. Если они не показывают вызов функции, то это то, где вам нужно исследовать. Убедитесь, что у вас включен «Включить триггер» для триггера S3 и что ** Тип события ** «Объект создан (все)». –
Вот оно!Сначала я настроил фильтр, чтобы запускать только файлы 'png' ... Большое спасибо. Должен был это знать. –