untarring Dateien auf S3 schlägt fehl, nicht sicher, warum

(neue Informationen unten) Ich versuche, eine Lambda-Funktion einzurichten, die auf hochgeladene TGZ-Dateien reagiert, indem sie dekomprimiert und die Ergebnisse in S3 zurückgeschrieben werden. Das Entpacken und Entpacken funktioniert einwandfrei, aber das Hochladen auf S3 schlägt fehl:

/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350
    var buf = self.body.read(self.partSize - self.partBuffer.length) ||
                        ^
TypeError: undefined is not a function
    at ManagedUpload.fillStream (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350:25)
    at Entry.<anonymous> (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:167:28)
    at Entry.emit (events.js:104:17)
    at Entry._read (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:123:12)
    at Entry.end (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:82:8)
    at Parse._process (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:107:13)
    at BlockStream.<anonymous> (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:47:8)
  ,  at BlockStream.emit (events.js:107:17)
    at BlockStream._emitChunk (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:145:10)
    at BlockStream.write (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:45:10)

Dieser Fehler tritt auf, wenn ich in S3 schreibe, aber wenn ich stattdessen die Dateien lokal auf die Festplatte schreibe, funktioniert dies, sodass die Pipeline korrekt ist.

Hier ist der Code, der das Problem demonstriert:

var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var zlib = require('zlib');
var tar = require('tar');
var fstream = require('fstream');

fstream.Reader({'path': 'testdata.tar.gz'})
    .pipe(zlib.Unzip())
    .pipe(tar.Parse())
    .on('entry', function(entry) {
        var filename = entry.path;
        console.log('got ' + entry.type + ' ' + filename);
        if (entry.type == 'File') {
            if (1) { // switch between working and nonworking cases
                s3.upload({Bucket: 'my_bucket', Key: 'gunzip-test/' + filename, Body: entry}, {},
                          function(err, data) {
                              if (err) 
                                  console.log('ERROR!');
                              else
                                  console.log('OK');
                          });
            }
            else {
                entry.pipe(fstream.Writer({ 'path': '/tmp/mytest/' + filename }));
            }
        }
    });

Wenn der Code so eingestellt ist, dass er in S3 schreibt, schlägt dies mit dem oben genannten Fehler fehl. Wenn die extrahierten Dateien lokal geschrieben werden, ist dies erfolgreich. ENTRY ist ein Stream und sollte laut Doc im Upload-Body-Parameter akzeptiert werden. Ich habe eine print-Anweisung in ManagedUpload eingefügt, in der der Fehler auftritt, und habe bestätigt, dass self.body ein Stream ist:

var stream = require('stream');
console.log('is it a stream? ' + ((self.body instanceof stream) ? 'yes' : 'no'));
console.log('self.body.read is ' + self.body.read);

kehrt zurüc

$ got File gunzip.js
is it a stream? yes
self.body.read is undefined

Ich bin ziemlich neu bei aws und node.js, daher könnte es ein grundlegendes Problem damit geben, aber ich habe einen Tag damit verbracht und es nicht gefunden. Ich habe den Upload-Aufruf mit unzip anstelle von gzip durchgeführt und es hat funktioniert mit Lambda-Funktionen zum Entpacken von Archiven in S3 ist wirklich sloooooow) Kann mich jemand auf etwas hinweisen, das ich in diesem Code falsch gemacht habe?

Vielen Dan

Ich glaube, ich verstehe das etwas besser. Ich zerbrach die Pipeline in Stücke und sah jeden an. Das Problem ist, dass tar.Parse fstream und nicht stream verwendet. Wenn ich die Rückgabe der Anweisung .pipe (tar.Parse ()) betrachte, handelt es sich um einen Stream, aber nicht um einen Stream.Readable oder einen Stream.Writable. fstream definiert keine read () -Methode (ihr Reader basiert auf Stream, sie ist kein Stream. Readable), also hat tar.Parse, das auf Stream basiert, auch keine.

So ist eine Verfeinerung der Frage, ist dies ein Fehler in fstream oder ist fstream nicht dazu gedacht, ein Stream zu sein? Ich denke, es ist ein Fehler - aus der README:

"Wie FS - Streams, jedoch mit stat und unterstützenden Verzeichnissen und symbolischen Links sowie normalen Dateien. Außerdem können Sie hiermit die Statistiken für eine Datei festlegen, auch wenn Sie deren Inhalt nicht ändern zum Erstellen eines Symlinks usw. "