2016-08-25 2 views
3

나는 다음과 같은 JSON 형식으로 주어진 URL의 screengrab를 취할 것입니다 아마존 람다에 간단한 스크린 샷 프로그램을 작성하는 것을 시도하고있다 :노드 JS - s3bucket에 아마존 람다에서 TMP /에서 파일을 이동

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

내 람다 함수에 대한 코드는 다음과 같습니다 :

'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을 살펴 봤지만 어디서 잘못되었는지 보지 못했습니다.

이 문제에 대한 도움을 주시면 대단히 감사하겠습니다.

UPDATE

문제는 파일이/tmp 디렉토리에 생성되는 것으로 나타납니다하지만 크기가 0 바이트

와 .PNG 파일이 어떤 데이터가 S3에 복사됩니다 그래서 때 기록되지 않습니다
+0

u를 확인 않았다 tmp 디렉토리 문제는 Afterall는/tmp 파일에 기록하는 것으로 보인다 –

+0

/제대로 만든 파일을보십시오. 파일이 생성되었지만 비어 있습니다. 왜 이럴 수 있니? –

답변

3

'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); 
       } 
      }); 
     }); 
    }); 
} 
+0

여기에서 문제가 무엇인지 설명 할 수 있습니까? –