Создание лямбда-функции для создания эскиза для AWS s3 bucket не работает

Я учусь с помощью AWS лямбда-функций. То, что я пытаюсь сделать, это когда я загружаю файл изображения (jpg) в корзину s3, размер изображения будет изменен. Но это не работает. Пожалуйста, что я сделал ниже.

Я создаю папку. Затем создал папку node_modules внутри ранее созданной папки. Затем создал файл с именем CreateThumbnail.js внутри основной папки.

Это CreateThumbnail.js

// dependencies
var async = require('async');
var AWS = require('aws-sdk');
var gm = require('gm')
            .subClass({ imageMagick: true }); // Enable ImageMagick integration.
var util = require('util');

// constants
var MAX_WIDTH  = 100;
var MAX_HEIGHT = 100;

// get reference to S3 client 
var s3 = new AWS.S3();

exports.handler = function(event, context, callback) {
    // Read options from the event.
    console.log("Reading options from event:\n", util.inspect(event, {depth: 5}));
    var srcBucket = event.Records[0].s3.bucket.name;
    // Object key may have spaces or unicode non-ASCII characters.
    var srcKey    =
    decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));  
    var dstBucket = srcBucket + "resized";
    var dstKey    = "resized-" + srcKey;

    // Sanity check: validate that source and destination are different buckets.
    if (srcBucket == dstBucket) {
        callback("Source and destination buckets are the same.");
        return;
    }

    // Infer the image type.
    var typeMatch = srcKey.match(/\.([^.]*)$/);
    if (!typeMatch) {
        callback("Could not determine the image type.");
        return;
    }
    var imageType = typeMatch[1];
    if (imageType != "jpg" && imageType != "png") {
        callback('Unsupported image type: ${imageType}');
        return;
    }

    // Download the image from S3, transform, and upload to a different S3 bucket.
    async.waterfall([
        function download(next) {
            // Download the image from S3 into a buffer.
            s3.getObject({
                    Bucket: srcBucket,
                    Key: srcKey
                },
                next);
            },
        function transform(response, next) {
            gm(response.Body).size(function(err, size) {
                // Infer the scaling factor to avoid stretching the image unnaturally.
                var scalingFactor = Math.min(
                    MAX_WIDTH / size.width,
                    MAX_HEIGHT / size.height
                );
                var width  = scalingFactor * size.width;
                var height = scalingFactor * size.height;

                // Transform the image buffer in memory.
                this.resize(width, height)
                    .toBuffer(imageType, function(err, buffer) {
                        if (err) {
                            next(err);
                        } else {
                            next(null, response.ContentType, buffer);
                        }
                    });
            });
        },
        function upload(contentType, data, next) {
            // Stream the transformed image to a different S3 bucket.
            s3.putObject({
                    Bucket: dstBucket,
                    Key: dstKey,
                    Body: data,
                    ContentType: contentType
                },
                next);
            }
        ], function (err) {
            if (err) {
                console.error(
                    'Unable to resize ' + srcBucket + '/' + srcKey +
                    ' and upload to ' + dstBucket + '/' + dstKey +
                    ' due to an error: ' + err
                );
            } else {
                console.log(
                    'Successfully resized ' + srcBucket + '/' + srcKey +
                    ' and uploaded to ' + dstBucket + '/' + dstKey
                );
            }

            callback(null, "message");
        }
    );
};

Затем я заархивировал папку. Затем я создал функцию в лямбда-консоли AWS и загрузил zip-файл из интерфейса следующим образом.

Затем я добавил триггер s3, как на скриншоте.

Я также создал роль с правильными разрешениями и политиками.

Но когда я загружаю файл JPG в корзину s3, он не изменяется ни в размере, ни в миниатюре. Что здесь может быть не так?

Это политика функций:

1 ответ

Лямбда-функции отправляют свою отладочную информацию в Amazon CloudWatch Logs. Изучите файл журнала, чтобы определить, что пошло не так.

Если нет журнала, то либо функция Lambda никогда не выполнялась, либо функция Lambda не получила достаточных разрешений для записи в журналы CloudWatch.

См. Доступ к журналам Amazon CloudWatch для AWS Lambda.

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