【问题标题】:Node js - Moving a file from /tmp in Amazon Lambda to an s3bucketNode js - 将文件从 Amazon Lambda 中的 /tmp 移动到 s3bucket
【发布时间】:2017-01-01 17:06:43
【问题描述】:

我正在尝试在 amazon lambda 中编写一个简单的屏幕截图程序,它将以以下 JSON 格式获取给定 url 的屏幕截图:

{
  "site": "www.google.com",
  "width": "320",
  "height": "480"
}

我的 lambda 函数的代码如下:

'use strict';

var AWS = require('aws-sdk');
var fs = require('fs');
var webshot = require('webshot');
var request = require('request');

var s3bucket = '<bucket-name>';
exports.handler = function(event, context, callback) {
  console.log( "Attempting to screenshot:", event.site);

  var parts = event.site.split('?'),
      base64Key = new Buffer(parts[0].toLowerCase()).toString('base64').replace(/\//g, '|').replace(/\+/g, '$') + '.png',
      options = {
        shotSize: {
          width: event.width,
          height: event.height
        }
      },
      s3 = new AWS.S3(),
      renderStream = webshot(event.site, options),
      file = fs.createWriteStream('/tmp/' + base64Key, {encoding: 'binary'}),
      bin = '';

  renderStream.on('data', function(data) {
    // bin += data.toString('binary');
    file.write(data.toString('binary'), 'binary');
  });

  renderStream.on('end', function() {
    // var options = {
    //    Bucket: s3bucket,
    //    Key: base64Key,
    //    ACL: 'public-read',
    //    body: file
    // };
    // s3.putObject(options, function(err, data) {
    //     if(err) {
    //       callback(err);
    //     } else {
    //       callback(null, 'Image uploaded to Amazon s3 bucket: ' + s3bucket);
    //     }
    // });


    var buffer = new Buffer(bin);
    s3.putObject({
        Bucket: s3bucket,
        Key: base64Key,
        ACL: 'public-read',
        Body: buffer.toString('binary')
    }, function(err, data) {
       if(err) {
         callback(err);
       } else {
         callback(null, 'Image uploaded to Amazon s3 bucket: ' + s3bucket);
       }
    });
  });
}

我的问题是这样的:

当我将文件写入 /tmp 目录时,它按预期存在,但是,当我尝试将 /tmp 目录中的图像上传到我的 s3 存储桶时,它无法正常工作。

我已尝试上传原始数据(bin),并且也在上面注释的缓冲区内。我也尝试过直接上传文件流,尽管这些尝试没有奏效。

在亚马逊上运行时,日志文件没有显示任何错误。我已经查看了 putObject 上的Docs,尽管我似乎看不出哪里出错了。

对此的任何帮助将不胜感激。

更新

问题似乎是该文件是在 /tmp 中创建的,但没有向其中写入任何数据,因此当它被复制到 S3 时,会有一个大小为 0 字节的 .png 文件

【问题讨论】:

  • 你检查了吗,在 /tmp 目录中创建的文件正确
  • 问题似乎是写入 /tmp 文件。该文件已创建但为空。为什么会这样?

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


【解决方案1】:

试试这个

'use strict';
exports.handler = function(event, context, callback) {

var AWS = require('aws-sdk');
var fs = require('fs');
var webshot = require('webshot');
var request = require('request');
var s3bucket = '<bucket-name>';

console.log( "Attempting to screenshot:", event.site);

  var parts = event.site.split('?'),
      base64Key = new Buffer(parts[0].toLowerCase()).toString('base64').replace(/\//g, '|').replace(/\+/g, '$') + '.png',
      options = {
        shotSize: {
          width: event.width,
          height: event.height
        }
      },
      s3 = new AWS.S3(),
      renderStream = webshot(event.site, options),
      file = fs.createWriteStream('/tmp/' + base64Key, {encoding: 'binary'}),
      bin = '';

  renderStream.on('data', function(data) {
    // bin += data.toString('binary');
    file.write(data.toString('binary'), 'binary');
  });

  renderStream.on('end', function() {

        fs.readFile(path, function (err, file_buffer) {

            var params = {
                Bucket: s3bucket,
                Key: 'base64Key',
                Body: file_buffer
            };

            s3.putObject(params, function (err, pres) {
                if (err) {
                   callback(err);
                } else {
                      callback(null, 'Image uploaded to Amazon s3 bucket: ' + s3bucket);
                }
            });
        });
  });
}

【讨论】:

  • 你能解释一下这里有什么问题吗?
猜你喜欢
  • 2014-01-28
  • 2017-02-28
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2015-05-08
  • 2021-11-23
相关资源
最近更新 更多