【问题标题】:Unable to create a resized image using AWS Lambda无法使用 AWS Lambda 创建调整大小的图像
【发布时间】:2023-03-21 18:54:01
【问题描述】:

我创建了一个 AWS Lambda 函数来调整放入我的 s3 存储桶中的任何图像的大小。我为 s3 存储桶中的每个对象创建创建了一个事件,以供 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 存储桶中创建调整大小的图像。有人可以帮我吗?

【问题讨论】:

  • 您的 Lambda 函数是否实际被调用?您应该将一些日志记录添加到您的 index.js(使用 console.log),然后上传一个 S3 对象,然后查看您的 Lambda 函数的 CloudWatch 日志。
  • 我的 lambda 函数正在被调用。我还添加了 console.log 语句以在 cloudwatch 上进行验证。我的观察是给定的 n url 没有调用请求 npm 节点模块。
  • 我会使用 S3 getObject API 调用来检索对象而不是 HTTP 请求。示例 Lambda 事件函数之一就是这样做的(请参阅 s3-get-object 蓝图)。
  • 如果您添加了 console.log 消息,请分享。

标签: amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

您似乎在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();
}

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多