no se pueden descomprimir archivos en S3, no estoy seguro de por qué

(nueva información a continuación) Estoy tratando de configurar una función lambda que reacciona a los archivos tgz cargados descomprimiéndolos y escribiendo los resultados en S3. El descomprimir y descomprimir funcionan bien, pero la carga a S3 falla:

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

Este error ocurre cuando escribo en S3, pero si en cambio escribo los archivos localmente en el disco, funciona, por lo que la canalización es correcta.

Aquí hay un código que demuestra el problema:

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

Si el código está configurado para escribir en S3, falla con el error anterior, si escribe los archivos extraídos localmente, tiene éxito. ENTRY es una secuencia y, de acuerdo con el documento, debe aceptarse en el parámetro Body de carga. Puse una declaración impresa en ManagedUpload, donde llega el error, y confirmó que self.body es una transmisión:

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

devoluciones

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

Soy bastante nuevo con aws y node.js, por lo que podría haber un problema básico con esto, pero he pasado un día y no lo he encontrado. Hice la llamada de carga con descomprimir en lugar de gzip y funcionó (Usar funciones lambda para descomprimir archivos en S3 es realmente lento) ¿Alguien puede señalarme algo que estoy haciendo mal en este código?

Gracias

Creo que entiendo esto un poco mejor. Rompí la tubería en pedazos y miré a cada uno. El problema es que tar.Parse usa fstream y no stream. Si miro el retorno de la instrucción .pipe (tar.Parse ()) es una secuencia, pero no es una secuencia. Legible o una secuencia. Escrita. fstream no define un método read () (su lector está basado en Stream, no es un stream. Legible), por lo que tar.Parse, que está basado en Stream, tampoco tiene uno.

Entonces, un refinamiento de la pregunta es, ¿es esto un error en fstream, o fstream no está destinado a ser una secuencia? Creo que es un error, desde el archivo README:

"Al igual que las secuencias FS, pero con estadísticas en ellas, y directorios y enlaces simbólicos compatibles, así como archivos normales. Además, puede usar esto para establecer las estadísticas en un archivo, incluso si no cambia su contenido, o para crear un enlace simbólico, etc. "

Respuestas a la pregunta(2)

Su respuesta a la pregunta