Ошибка: поток дает пустой буфер при уменьшении качества изображения с помощью gm на AWS Lambda

Я прочитал все другие темы и попробовал несколько ответов, но я не могу понять, почему я получаю эту ошибку. Мой код получает загруженную картинку в корзину S3, снижает качество и помещает ее во вторую корзину. Легко и просто. С маленькими / средними изображениями все работает просто отлично, но если я загружаю что-то более 2 МБ (более или менее), я получаю ошибку в заголовке. Моя лямбда-функция имеет 128 МБ и 3 минуты ожидания; вот код:

const gm = require('gm').subClass({imageMagick: true});
const AWS = require('aws-sdk');
const async = require('async');
const S3 = new AWS.S3();

exports.handler = (event, context, callback) => {
    var srcBucket = event.Records[0].s3.bucket.name;    
    var srcKey = event.Records[0].s3.object.key;
    var dstBucket = "destinationbucket";
    var dstKey = "resized-" + srcKey;

     // Infer the image type.
    var typeMatch = srcKey.match(/\.([^.]*)$/);
    if (!typeMatch) {
        callback("Could not determine the image type.");
        return;
    }

    var imageType = typeMatch[1].toLowerCase();
    if (imageType != "jpg" && imageType != "png" && imageType != "jpeg") {
        callback('Unsupported image type: ${imageType}');
        return;
    }
    async.waterfall([
        function download(next) {
            S3.getObject({Bucket : srcBucket, Key : srcKey}, next);
        },
        function transform(response, next) {
            var img_quality_reduced = gm(response.Body);
            img_quality_reduced.quality(75).toBuffer(function( error, buffer )
                {
                    if( error ) { console.log( error ); return; }
                     next(null, response.ContentType, buffer);
                }
            );
        },
        function upload(contentType, data, next) {
            S3.putObject({Bucket: dstBucket, Key: dstKey, Body: data}, next);
        },
    function ending(next) {
        console.log('got to ending');
        context.done();
    }
    ], function (err) {
        console.log(err);
        context.done();
    });
};

Есть идеи, почему это происходит? Я загрузил async, gm и graphicsmagick в Lambda (в виде zip-файла). все скачивается через нпм

0 ответов

Другие вопросы по тегам