Amazon web services 无法使用AWS Lambda创建调整大小的图像

Amazon web services 无法使用AWS Lambda创建调整大小的图像,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我已经创建了一个AWS Lambda函数来调整放入s3存储桶中的任何图像的大小。我已经为s3 bucket中的每个对象创建了一个事件,以便Lambda函数触发。我的Lambda处理程序代码如下: var async = require('async'), gm = require('gm').subClass({ imageMagick: true }) // Enable ImageMagick integration. , request = require('request

我已经创建了一个AWS Lambda函数来调整放入s3存储桶中的任何图像的大小。我已经为s3 bucket中的每个对象创建了一个事件,以便Lambda函数触发。我的Lambda处理程序代码如下:

var async = require('async'),
    gm = require('gm').subClass({
    imageMagick: true
}) // Enable ImageMagick integration.
, request = require('request').defaults({
    encoding: null
});

var knox = require('knox');
var client = knox.createClient({
key: 'myKey',
secret: 'mySecretKey',
bucket: 'MyBucketName'
});


//hardcoded Value to get the Image url
var s3value = '.s3.amazonaws.com/';
var https = 'https://'

exports.handler = function (event, context) {
var srcBucket = event.Records[0].s3.bucket.name;
var srcKey = event.Records[0].s3.object.key;
var imageUrl = https + srcBucket + s3value + srcKey //My Http Url for image stored in s3 bucket.
request(imageUrl, function (err, res, res1) {
    if (err) {
        console.log(err);
    } else {
        gm(res1).resize(120)
            .toBuffer('jpg', function (err, buffer) {
                if (err) {
                    console.log(err);
                } else {
                    var ImageName = "/" + imageUrl.substr(0, imageUrl.indexOf(".")) + "-1x" + imageUrl.substr(imageUrl.indexOf("."), imageUrl.length); //Renaming the present image
                    client.putBuffer(buffer, ImageName, function (err, response1) {
                        if (err) {
                            console.log(err);
                        } else {
                            console.log(response1.socket._httpMessage.url);
                        }
                    });
                }
            });
    }
});
context.done();
}

我的问题是,当我在S3中存储图像时,在我的S3存储桶中没有创建调整大小的图像。我无法理解为什么我无法在同一个s3存储桶中创建调整大小的图像。有人能帮我吗?

看起来您在调用
request()
的回调函数之外的
context.done()
。这将在任何图像大小调整完成之前结束Lambda函数。仅当所有处理完成或失败时,才应调用
context.done()

exports.handler = function (event, context) {
    var srcBucket = event.Records[0].s3.bucket.name;
    var srcKey = event.Records[0].s3.object.key;
    var imageUrl = https + srcBucket + s3value + srcKey //My Http Url for image stored in s3 bucket.
    request(imageUrl, function (err, res, res1) {
        if (err) {
            console.log(err);
            context.fail(err);
        } else {
            gm(res1).resize(120)
                .toBuffer('jpg', function (err, buffer) {
                    if (err) {
                        console.log(err);
                        context.fail(err);
                    } else {
                        var ImageName = "/" + imageUrl.substr(0, imageUrl.indexOf(".")) + "-1x" + imageUrl.substr(imageUrl.indexOf("."), imageUrl.length); //Renaming the present image
                        client.putBuffer(buffer, ImageName, function (err, response1) {
                            if (err) {
                                console.log(err);
                                context.fail(err);
                            } else {
                                console.log(response1.socket._httpMessage.url);
                                context.succeed("It worked");
                            }
                        });
                    }
                });
        }
    });
    // Don't call context.done() here, the callback hasn't run yet
    //context.done();
}

您的Lambda函数实际被调用了吗?您应该向index.js(使用console.log)添加一些日志记录,然后上载一个S3对象,然后查看Lambda函数的CloudWatch日志。My Lambda函数正在被调用。我还添加了console.log语句以在cloudwatch上验证它。我的观察结果是,对于给定的n url,没有调用请求npm节点模块。我将使用S3 getObject API调用来检索对象,而不是HTTP请求。其中一个示例Lambda事件函数正是这样做的(请参阅s3获取对象蓝图)。如果添加了console.log消息,请共享它们。