【问题标题】:My lambda function isn't working properly我的 lambda 函数无法正常工作
【发布时间】:2020-07-18 15:40:51
【问题描述】:

我试图让 lambda 压缩所有上传到我存储桶中某个文件的图像,所以我做了什么:

  1. 我创建了一个带有前缀的 lambda 函数:myfile/*/

  2. 我部署了我的 nodejs 代码


//Import compress module
const imagemin = require('imagemin');
const imageminMozjpeg = require('imagemin-mozjpeg');
const sharp = require('sharp');

const AWS = require('aws-sdk')

const s3 = new AWS.S3()
exports.handler = async (event) =>{
    // TODO implement
    
    const srcBucket = event.Records[0].s3.bucket.name;
    
    const srcKey    = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
    const dstBucket = "safarni";
    const dstKey    =  srcKey;
    
    console.log(srcKey, dstBucket, dstKey)
     // Download the image from the S3 source bucket. 
    try {
        const params = {
            Bucket: srcBucket,
            Key: srcKey
        };
        var origimage = await s3.getObject(params).promise();

    } catch (error) {
        console.log(error);
        return;
    }  
    console.log('here')
    const jpgBuffer = sharp(origimage.Body).toBuffer().jpeg().toBuffer()
    
    //Compressing the photo
        const compressedjpgBuffer = await imagemin.buffer(jpgBuffer, {
            plugins: [imageminMozjpeg({ quality: 85 })]
        })
        
    // Upload the thumbnail image to the destination bucket
    try {
        const destparams = {
            Bucket: dstBucket,
            Key: dstKey,
            Body: compressedjpgBuffer,
            ContentType: "image"
        };

        const putResult = await s3.putObject(destparams).promise(); 
        
    } catch (error) {
        console.log(error);
        return;
    } 
        
    console.log('Successfully resized ' + srcBucket + '/' + srcKey +
        ' and uploaded to ' + dstBucket + '/' + dstKey); 
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

  1. 我使用以下策略向 lambda 添加了一个角色
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}
  1. 我公开了我的源存储桶,以便我可以轻松访问它,但我在目标存储桶中添加了一个策略,如下所示
{
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::272222288325:role/LambdaRole" //Role i assigned to my lambda function
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::safarni/*"
        }

错误: 由于某种原因,它没有调用,我不知道为什么,所以我真的很感激任何帮助

编辑 Lambda 设置

我的角色政策

【问题讨论】:

  • 您是否检查过您的 Lambda 的 CloudWatch 日志?
  • 是的,但我认为由于某种原因它甚至没有被调用 idk
  • 我尝试将文件上传到posts/12134目录(我的前缀是posts/*/)但没有调用该函数
  • 您是否设置了 lambda 触发器?我正在尝试了解您的 lambda 是如何被调用的!
  • @AbdelrahmanShahda 在您的问题中,我没有看到任何提及将触发器从 s3 设置为 Lambda。你能确认你是否设置了触发器吗?

标签: node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

如果您使用了 myfile/*/ 前缀,则不会调用它。您的前缀应为 myfile/ 而不是 myfile/*

这当然也会触发存在于 myfile 前缀中的任何文件,但它也是递归的,因此任何具有以 myfile 开头的键的对象也将被包括在内,例如:

  • myfile/test.txt
  • myfile/test/test.txt
  • myfile/test/test2/test2.txt

S3 对象名称是其关键,/ 字符只是显示为好像 S3 存储桶的结构包含嵌套的子文件夹结构,但实际上它只是前缀 listing objects

【讨论】:

  • 不幸的是,这不起作用。我不知道这是否有帮助,但我尝试手动上传文件并使用预签名的 url 仍然没有发生任何事情
  • 如果这可能有帮助,我可以为调用前缀和其他设置截图
  • 请上传您的设置截图
  • 你的 S3 对象的键是什么?
  • 好的,我添加了一些屏幕截图,不知道这是否足够,但如果您需要任何其他屏幕截图,请告诉我
【解决方案2】:

您需要像这样为您的存储桶提供调用权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowS3ToABCFunction",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:<region>:<account>:function:<function_name>"
    }
   ]
}

查看link 了解更多详情。

另外,在您的问题中,我没有看到任何设置从 s3 到 lambda 的触发器的步骤。 您可能想以link 为例。

【讨论】:

    【解决方案3】:

    我可能错了,但我的第一个猜测是您的语句中可能缺少 lambda 调用操作?像这样的:

    "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "lambda:InvokeFunction"
                ],
                "Resource": "*"
            },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2013-03-27
      • 2012-08-15
      • 2013-11-05
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多