2016-05-17 6 views
3

Ich versuche, ein Lambda-Skript, das ein Bild von einer Website ziehen und in S3 speichern kann, zu schreiben. Das Problem, das ich habe, ist, welche Art von Objekt als Body-Attribut in die S3.putObject-Methode übergeben werden. In der Dokumentation here heißt es, dass es entweder new Buffer('...') || 'STRING_VALUE' || streamObject sein sollte, aber ich bin mir nicht sicher, wie man die https Antwort in eine von denen umwandelt. Hier ist, was ich versucht habe:aws Lambda, wie ein Bild gespeichert über HTTPS in S3

var AWS = require('aws-sdk'); 
var https = require('https'); 
var Readable = require('stream').Readable; 
var s3 = new AWS.S3(); 
var fs = require('fs'); 

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

exports.handler = function(event, context) { 
    https.get(url, function(response) { 
    var params = { 
    Bucket: 'example', 
    Key: 'aws-logo.png', 
    Body: response // fs.createReadStream(response); doesn't work, arg should be a path to a file... 
        // just putting response errors out with "Cannot determine length of [object Object]" 
    }; 

    s3.putObject(params, function(err, data) { 
     if (err) { 
     console.error(err, err.stack); 
     } else { 
     console.log(data); 
     } 
    }); 
    }); 
}; 
+0

Bitte beachten Sie http://stackoverflow.com/questions/19016130/pushing-binary-data-to -amazon-s3-using-node-js – Shibashis

+0

Wenn ich mich nicht irre, sieht es so aus, als würde das Skript in diesem Beispiel auf einem lokalen Rechner laufen, sie benutzen curl um die Datei auf dem Datenträger zu speichern und dann ein Stream mit dem Pfad zu dieser gespeicherten Datei. Da ich auf Lambda bin kann ich die Datei nicht auf Platte speichern – kleaver

+0

"Da ich auf Lambda bin kann ich die Datei nicht auf Platte speichern". Das ist nicht korrekt. Sie haben Speicherplatz auf Lambda, um Dateien vorübergehend zu speichern. –

Antwort

3

Wie in den Kommentaren angegeben, ermöglicht Lambda-Dateien in /tmp zu speichern. Aber Sie brauchen es nicht wirklich ...

response enthält nicht den Inhalt der Datei, sondern die HTTP-Antwort (mit seinem Statuscode und Kopfzeilen).

Man könnte so etwas wie dies versuchen:

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

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

exports.handler = function(event, context) { 
    https.get(url, function(res) { 
    var body = ''; 
    res.on('data', function(chunk) { 
     // Agregates chunks 
     body += chunk; 
    }); 
    res.on('end', function() { 
     // Once you received all chunks, send to S3 
     var params = { 
     Bucket: 'example', 
     Key: 'aws-logo.png', 
     Body: body 
     }; 
     s3.putObject(params, function(err, data) { 
     if (err) { 
      console.error(err, err.stack); 
     } else { 
      console.log(data); 
     } 
     }); 
    }); 
    }); 
}; 
+0

nur für den Datensatz "s3" ist hier undefined, ich musste hinzufügen: '' 'var s3 = neue AWS.S3();' '' –

+0

@EliAlbert Antwort aktualisiert :) –

3

versuchen, dieses Paket https://www.npmjs.com/package/request

var request = require('request'); 

exports.handler = function (event, context) { 
    s3.putObject({ 
     Bucket: 'example', 
     Key: 'aws-logo.png', 
     Body: request.get(url, {followRedirect: false}) 
    }, function (err, data) { 
     if (err) console.error(err, err.stack); 
     else console.log(data); 
    }) 
} 
+0

Dies würde gut funktionieren, aber die ' Das Request-Modul befindet sich nicht im Core-Knoten, daher wählte ich @ alexis-no answer, weil das Laden dieses zusätzlichen Moduls nicht erforderlich war – kleaver

Verwandte Themen