【问题标题】:nodejs Lambda with S3 upload via API Gateway通过 API Gateway 上传 S3 的 nodejs Lambda
【发布时间】:2019-02-14 08:40:09
【问题描述】:

我一直在尝试让一个简单的无服务器 API 网关 -> NodeJS Lambda -> S3 工作,但似乎 Lambda 只是上传了损坏的文件。

此代码将从 URL 下载文件,然后直接上传到 S3。 我尝试了 putObject 和上传(使用不同的参数)都没有成功。查看我下载原始文件时的文件大小是 24KB,而从 S3 下载的(损坏的)图像是 44KB。

我只是通过对 API Gateway URL 执行 POST 来测试应用程序。

有什么想法吗?

var url =
  "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png"
module.exports.upload = function(event, context, callback) {
  https.get(url, function(res) {
    var body = ""
    res.on("data", function(chunk) {
      // Agregates chunks
      body += chunk
    })
    res.on("end", function() {
      console.log(body)

      // Once you received all chunks, send to S3 - putObject only
      var params = {
        Bucket: S3_BUCKET_NAME,
        Key: "aws-logo.png",
        Body: body
      }

      var s3Params = {
        Bucket: S3_BUCKET_NAME,
        Key: "aws-logo-upload.png",
        Body: body,
        ContentType: "image/png"
      }

      s3.upload(s3Params, function(err, data) {
        // s3.putObject(params, function(err, data) {
        if (err) {
          console.log("error")
          console.error(err, err.stack)
          callback(null, { statusCode: 404, error })
        } else {
          console.log("ok")
          console.log(data)
          let response = {
            statusCode: 200
          }
          callback(null, response)
        }
      })
    })
  })
}

【问题讨论】:

  • 可能请求执行了两次。您是否将 lambda 函数绑定到任何事件?
  • 它通过我的 serverless.yml 绑定:函数:上传:处理程序:handler.upload 事件:-http:路径:事件/上传方法:发布
  • 您的代码是否在 API Gateway/Lambda 之外工作?
  • 当我尝试在 AWS 控制台中手动测试/运行它时它不起作用。

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


【解决方案1】:

以下代码适用于 API Gateway/Lambda 之外的我。它在 S3 中生成一个可作为有效 23.7 KB 图像下载的 PNG。我希望等价物可以在 Lambda 中工作。

const AWS = require('aws-sdk');
const https = require('https');
const s3 = new AWS.S3();

const logourl =
  'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png';

const getThenUpload = (url, callback) => {
  https.get(url, (res) => {
    const data = [];

    res.on('data', (chunk) => {
      data.push(chunk);
    });

    res.on('end', () => {
      const params = {
        Bucket: S3_BUCKET_NAME,
        Key: 'aws-logo-upload.png',
        Body: Buffer.concat(data),
        ContentType: 'image/png',
      };

      s3.upload(params, (err, rsp) => {
        if (err) {
          console.error(err, err.stack);
          callback(err, { statusCode: 404, err });
        } else {
          console.log(rsp);
          callback(null, { statusCode: 200 });
        }
      });
    });
  });
};

getThenUpload(logourl, (err, data) => {
  if (err) {
    console.error(`Error: ${err}`);
  } else {
    console.log(`Data: ${JSON.stringify(data)}`);
  }
});

【讨论】:

  • 您通过 API 网关发布什么?实际文件内容、指向文件的 URL 还是其他?
  • 感谢您的帮助 :) 工作!不得不更改我的一些 API Gateway 集成。这样我就可以将原始数据作为 Base64 传递。
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 2021-02-04
  • 2016-11-20
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2021-10-23
相关资源
最近更新 更多