使用Node.js从Lambda触发器调整S3存储桶中的图像大小

7

我是一名新手,对于nodejs和aws不太熟悉。请问有人能指出以下代码在调整s3存储桶中的图像大小方面出了什么问题吗?

代码如下:

 'use strict';
 const AWS = require('aws-sdk');
 const S3 = new AWS.S3({
 accessKeyId: "xxxxxxxxxxxx",
 secretAccessKey: "yyyyyyyyyyy", 
 region: "us-east-1", 
 signatureVersion: 'v4',
 });

const Sharp = require('sharp');
const BUCKET = "patientimg"; 
const URL = "https://s3.ap-south-1.amazonaws.com";
exports.handler = function(event, context, callback) {
const key = event.queryStringParameters.key;
const match = key.match(/(\d+)x(\d+)\/(.*)/);
const width = parseInt(match[1], 10);
const height = parseInt(match[2], 10);
const originalKey = match[3];

S3.getObject({Bucket: BUCKET, Key: originalKey}).promise()
.then(data => Sharp(data.Body)
  .resize(width, height)
  .toFormat('png')
  .toBuffer()
)
.then(buffer => S3.putObject({
    Body: buffer,
    Bucket: BUCKET,
    ContentType: "image/png",
    Key: key,
  }).promise()
)
.then(() => callback(null, {
    statusCode: '301',
    headers: {'location': "${URL}/${key}"},
    body: "",
  })
)
.catch(err => callback(err))
}

这是我正在使用的确切代码,使用"S3 put"请求进行测试时Lambda的输出
  {
   "errorMessage": "RequestId: edaddaf7-4c5e-11e7-bed8-13f72aaa5d38 Process exited before completing request"
    }

感谢您的提前帮助。

你找到答案了吗?问题可能是由于调整大小需要时间,而 Lambda 具有超时限制。Lambda 完成此操作所需的时间可能大于超时限制。 - itaintme
2个回答

2
使用lambda调整图像大小是一个经典的例子,AWS团队已经对此进行了很好的解释。请按照他们的说明操作,而不是其他方法。

https://aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/

正确的调整大小代码是:http://github.com/awslabs/serverless-image-resizing。你找到的任何内容都可能是错误的。
基本上它的工作原理如下:
  • 将此代码上传为您的lambda。
  • 转到lambda的触发器选项卡并复制URL
  • 转到您的s3存储桶并设置重定向规则:在404情况下,重定向到lambda URL。请求时图像将自动调整大小。
所有这些步骤都在上述AWS博客中详细记录。他们方法的好处是只有在实际需要时才会创建调整大小的图像,从而节省资源。

嗨Jk,根据你建议的AWS链接,我已经编辑了我的程序,但仍然出现错误。 - anna poorani

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接