Использование SSH2 и SFTPStream для потоковой передачи файла с сервера на AWS S3 Bucket - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь использовать модуль ssh2 , чтобы взять файл с сервера и добавить его в корзину S3 в AWS.Я хотел бы иметь возможность потоковой передачи файла, чтобы у меня не было его в памяти.Я попробовал следующее:

const Client = require('ssh2').Client;
const aws = require('aws-sdk');
const s3 = new aws.S3();

exports.handler = function(event, context, callback) {

    let connSettings = {
        host: event.serverHost,
        port: event.port,
        username: event.username,
        password: event.password
    };

    let conn = new Client();
    conn.on('ready', function() {

        conn.sftp(true, function(err, sftp) {

            if (err) throw err;

            let stream = sftp.createReadStream(filename);
            let putParams = {
                Bucket: s3Bucket,
                Key: s3Key,
                Body: stream
            };

            s3.putObject(putParams, function (err) {
                if (err) throw err;

                console.log("Uploaded!");
            });     
        });
    }).connect(connSettings);

};  

Однако метод sftp.createReadStream(filename) ищет мой локальный каталог, а не сервер.Что кроме этого, это работает.

Есть ли способ, как я могу передать файл с сервера на S3?

Я знаю, что мог бы использовать sftp.fastGet способ загрузить файл с сервера, сохранить его локально, а затем загрузить его на S3.Но я бы предпочел не сохранять файл локально.SDK s3 принимает поток, поэтому было бы гораздо удобнее просто передать его.

ОБНОВЛЕНИЕ : метод sftp.createReadStream(filename) правильно читает с сервера, а не локально.Это метод s3.putObject, который по какой-то причине пытается получить файл локально, хотя я даю ему поток.

1 Ответ

0 голосов
/ 04 декабря 2018

По какой-то причине метод s3.putObject ищет файл локально, хотя я даю ему поток.Поток содержит путь от сервера, но по какой-либо причине, когда метод s3.putObject метод читает поток, он пытается прочитать файл локально.

Я исправил это, вместо этого используя метод s3.upload.

s3.upload(putParams, function (err) {
    if (err) throw err;

    console.log("Uploaded!");
}); 
...