【发布时间】:2020-07-18 15:40:51
【问题描述】:
我试图让 lambda 压缩所有上传到我存储桶中某个文件的图像,所以我做了什么:
-
我创建了一个带有前缀的 lambda 函数:myfile/*/
-
我部署了我的 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;
};
- 我使用以下策略向 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:::*"
}
]
}
- 我公开了我的源存储桶,以便我可以轻松访问它,但我在目标存储桶中添加了一个策略,如下所示
{
"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 的 CloudWatch 日志?
-
是的,但我认为由于某种原因它甚至没有被调用 idk
-
我尝试将文件上传到posts/12134目录(我的前缀是posts/*/)但没有调用该函数
-
您是否设置了 lambda 触发器?我正在尝试了解您的 lambda 是如何被调用的!
-
@AbdelrahmanShahda 在您的问题中,我没有看到任何提及将触发器从 s3 设置为 Lambda。你能确认你是否设置了触发器吗?
标签: node.js amazon-web-services amazon-s3 aws-lambda