nodejs Lambda с загрузкой S3 через API-шлюз - PullRequest
0 голосов
/ 10 сентября 2018

Я пытался заставить работать простой безсерверный API-шлюз -> NodeJS Lambda -> S3, однако кажется, что Lambda просто загружает поврежденные файлы.

Этот код будет загружать файл с URL-адреса, а затем напрямую загружать на S3. Я пробовал оба метода putObject & upload (с разными параметрами), но безуспешно. Размер файла при загрузке оригинала составляет 24 КБ, а загруженного (поврежденного) образа с S3 - 44 КБ.

Я просто тестирую приложение, выполняя POST к URL-адресу шлюза API.

Есть идеи?

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)
        }
      })
    })
  })
}

1 Ответ

0 голосов
/ 10 сентября 2018

Следующий код работает для меня вне API Gateway / Lambda. Это дает PNG в S3, который загружается как действительное изображение 23,7 КБ. Я ожидаю, что эквивалент будет работать в 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)}`);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...