我正在使用节点8.1, 我想使用S3和lambda将PDF转换为图像,但是CloudWatch反复给出以下错误: “无法导入模块'索引':错误” 下面的文件在主项目文件夹中名为index.js:
const util = require('util');
const AWS = require('aws-sdk');
const gm = require('gm').subClass({ imageMagick: true });
const s3 = new AWS.S3();
exports.handler = (event, context) => {
const srcBucket = event.Records[0].s3.bucket.name;
const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
const dstBucket = srcBucket;
const dstKey = srcKey.replace('.pdf', '.png');
s3.getObject({Bucket: srcBucket, Key: srcKey}, (err, response) => {
if (err) {
context.done('S3 get object error:', err);
context.fail(err);
}
// conversion start
gm(response.Body)
.setFormat("png")
.resize(200) // you can configure
.quality(100) // you can configure
.stream((err, stdout, stderr) => {
if(err) {
console.log("gm conversion process error: ");
console.log(err,stdout,stderr);
context.fail(err);
}
const chunks = [];
stdout.on('data', (chunk) => {
chunks.push(chunk);
});
stdout.on('end', () => {
console.log('gm process finished');
const buffer = Buffer.concat(chunks);
// Upload start
const params = {
Bucket: dstBucket,
Key: dstKey,
ContentType: 'image/png',
Body: buffer
};
s3.putObject(params, (err, data) => {
if (err) {
console.log("S3 upload error: " + err);
context.fail(err);
}
console.log('S3 upload finished!');
console.log('Bucket: ' + dstBucket);
console.log('key: ' + dstKey);
context.succeed({
"error":false
});
});
});
stderr.on('data', (data) => {
console.log('stderr data: ' + data);
});
});
});
};
我对aws-lambda以及文件转换的了解不多,这是我唯一遇到的问题,找不到解决问题的方法。
我认为index.handler传递函数的方式可能会出现问题,但我不知道次要错误位于何处。
答案 0 :(得分:0)
问题听起来好像您没有正确配置.yml文件。
https://docs.aws.amazon.com/lambda/latest/dg/serverless-deploy-wt.html#serv-deploy(用于cli部署)
https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/(您需要编写的配置文件,以便aws知道要导入的内容)
答案 1 :(得分:0)
您是否尝试过在本地运行该代码?听起来像是语法错误。
无论如何,我只是创建了此功能,并且可以在此处的fit hub上使用:
https://github.com/rcastoro/PDFImagine
您可以从下面的视频中看到,它将PDF放入s3存储桶中,并使用aws事件通知lambda函数将新的PDF转换为图像。