Как загрузить файл из корзины S3 на сервер (SFTP) в NodeJS?

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

async function sendFileViaSftp(srcEvent){
    let Client = require('ssh2-sftp-client');
    let Path = '/';

    let sftp = new Client();
    await sftp.connect({
        host: '73.XXX.XX.XXX', 
        port: 22,
        username: 'username',
        password: 'mypassword'
    }).then(() => {
        console.log("Connected...");
        return sftp.list(Path);
    }).then((list) => {
        console.log("It worked");
        console.log("file to transfer: " + srcEvent.file);
        var fs = require('fs');
        var path = require('path');

        var params = {
            Bucket: srcEvent.bucket,
            Key: srcEvent.key
        };

        var tempFileName = path.join('/tmp/', srcEvent.file);
        var tempFile = fs.createWriteStream(tempFileName);

        s3.getObject(params).createReadStream().pipe(tempFile);
        console.log("file is in tmp");

        let data = fs.createReadStream(tempFileName);
        let remote = '/';
        sftp.put(data, remote);
        console.log("the code makes it to here and prints this");
        

        return list;
    }).catch((err) => {
        console.log('Catch Error: ', err);
        throw new Error(err);
    });
}

Я вызываю эту функцию следующим образом:

if (folder === 'something') {
        await sendFileViaSftp(srcEvent);
        return {
            statusCode: 200,
            body: srcEvent
        };
}

Я не получаю никаких сообщений об ошибках, похоже, что время истекло, чего я не понимаю, потому что я использую async/await. В моем примере я пытаюсь извлечь файл из корзины S3 и сохранить его в /tmp/, а затем отправить /tmp/test.xls. srcEvent.file is test.xls in this case.

Даже если я могу просто отправить пустой текстовый файл на свой сервер из этой функции, это было бы полезно. Спасибо!


person mastercool    schedule 05.02.2021    source источник


Ответы (1)


Я понял. Не уверен, в чем именно была проблема, но это успешно извлечет файл из S3, а затем загрузит его на SFTP-сервер:

async function sendFileViaSftp(srcEvent) {
    let Client = require('ssh2-sftp-client');
    var path = require('path');

    var localFolder = "/tmp";
    var remoteFolder = "/complete";

    var localfile = path.join(localFolder, srcEvent.file);
    var remotePath = path.join(remoteFolder, srcEvent.file);
    getFileFromS3(srcEvent, localFolder);

    let sftp = new Client();
    await sftp.connect(sftpCredentials).then(() => {

            try {
                return sftp.fastPut(localfile, remotePath);
            } catch (err) {
                console.log("Could not upload file: " + err);
            }
        })
        .then(() => {
            console.log("ending connections");
            sftp.end();
        })
        .catch(err => {
            console.error(err.message);
        });
}

async function getFileFromS3(srcEvent, localFolder) {
    var params = {
        Bucket: srcEvent.bucket,
        Key: srcEvent.key
    };

    var tempFileName = path.join(localFolder, srcEvent.file);
    var tempFile = fs.createWriteStream(tempFileName);

    s3.getObject(params).createReadStream().pipe(tempFile);
    console.log("Put file in temp");

}
person mastercool    schedule 05.02.2021