首页 > 解决方案 > 使用 SSH2 和 SFTPStream 将文件从服务器流式传输到 AWS S3 存储桶

问题描述

我正在尝试使用ssh2模块从服务器获取文件并将其添加到 AWS 中的 S3 存储桶中。我希望能够流式传输文件,这样我就不必将它放在内存中。我尝试了以下方法:

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。但我宁愿不必在本地保存文件。s3 SDK 接受流,因此只流式传输会更方便。

更新:该方法sftp.createReadStream(filename)正确地从服务器而不是本地读取。这s3.putObject是出于某种原因试图在本地获取文件的方法,即使我给它一个流。

标签: javascriptnode.jsamazon-web-servicesamazon-s3sftp

解决方案


出于某种原因,s3.putObject即使我给它一个流,该方法仍在本地查找文件。流包含来自服务器的路径,但无论出于何种原因,当方法s3.putObject方法正在读取流时,它会尝试在本地读取文件。

我通过使用该s3.upload方法解决了这个问题。

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

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

推荐阅读