Узел AWS Лямбда-выпуск: он работает, когда истекает время ожидания. Когда я перезваниваю, последний обработанный элемент фактически не обрабатывается - PullRequest
0 голосов
/ 17 января 2020

Мое лучшее предположение состоит в том, что у меня есть проблема с обещанием в моем коде, но я думаю, что это может быть и проблема с ssh2-sftp-client в моем коде.

Я написал это 10 различными способами. Думайте об этом как о коде Доказательства Концепции, а не письмах 12-летнего. В последней итерации я перешел к следующему этапу.

Пакетное задание.
* Захватывает файлы из S3 * Идет один за другим (по крайней мере, в этой итерации) и отправляет их SFTP поставщику * Удаляет файл в формате S3

Если я не обращаюсь к обратному вызову, время ожидания составляет 10 секунд, но все работает. Файлы перемещаются вверх менее чем за 4 секунды. Если я добавлю обратный вызов, будут обработаны только первые два. Мои выводы говорят, что третий файл был обработан, но это не так.

function processSingleFile(obj, fn, context) 
{
    return new Promise(async function(resolve, reject) 
    {
        //process.nextTick(async function () {
        try{
            console.log(obj);
            let pathVariables = obj.Key.split('/');
            let filename = pathVariables[2];
            let srcKeyString = pathVariables[1];


            console.log("Beginning to process: " + filename);

                /*
                let buffer =  s3.getObject({
                    Bucket: bucket_name,
                    Key: obj.Key
                }).createReadStream();
                */

                let buffer = await getS3File(bucket_name, obj.Key);
                console.log("Got file info " + obj.Key );

                let Client = require('ssh2-sftp-client');
                let sftp =  new Client();
                let remoteFilePath = '/Import/30Automations/' + filename;


                sftp.connect({
                    host: hostTargetName,
                    port: '22',
                    username: userName,
                    password: password
                }).then(() => {
                    sftp.put(buffer, remoteFilePath);
                }).then(() => {
                    sftp.end;
                    sftp.close;
                    //sftp.end();  //nothing works when I use this
                }).then(() => {
                    Client.end;  //not needed
                }).then(() => {
                    deleteEncryptedlFile(obj.Key);  //this part of code not shown
                }).then(() => {
                    console.log("Successfully processed: " + filename);
                    resolve();
                }).catch(err => {
                    console.error("ALERT in transfer for " + filename + ": " + err.message);
                    resolve();
                });

        }catch(err){
            console.log("ALERT:   processing single file: " + obj + "err: " + err);
            resolve();
        }
    }); 
  }


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

   context.callbackWaitsForEmptyEventLoop = false;
   async function moveFiles(){ 
        try{ 
            var params = { 
                Bucket: bucketname,
                Delimiter: '',
                Prefix: 'outgoing'
            }

            let index = 0;

            s3.listObjects(params, async function (err, data) {
                if(err)throw err;
                let rows = data.Contents.length;
                while (index < rows){
                    var reply = await processSingleFile(data.Contents[index]);
                    index++;
                    if (index === rows){
                         console.log("JOB COMPLETED");
                        callback(null, JSON.stringify("success"));  //if I comment out, all files are moved successfully but I time out.
                    }
                }
            });
       }catch(err){
            console.error("ALERT Error processing job.  See logs " + err.message);
            callback(JSON.stringify("Error"), null);
        }

    }
    moveFiles();
};

Вот вывод

2020-01-17T01:04:44.790Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Beginning to process: 20200115_Ta11_file3.txt.pgp
2020-01-17T01:04:44.923Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Got file info outgoing/professional/20200115_Ta11_file3.txt.pgp
2020-01-17T01:04:46.015Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    file deleted outgoing/professional/20200115_Ta11_file3.txt.pgp
2020-01-17T01:04:46.018Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Successfully processed: 20200115_Ta11_file3.txt.pgp

2020-01-17T01:04:46.019Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Beginning to process: 20200116_Ta11_file1.txt.pgp
2020-01-17T01:04:46.179Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Got file info outgoing/professional/20200116_Ta11_file1.txt.pgp
2020-01-17T01:04:47.091Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    file deleted outgoing/professional/20200116_Ta11_file1.txt.pgp
2020-01-17T01:04:47.093Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Successfully processed: 20200116_Ta11_file1.txt.pgp

2020-01-17T01:04:47.093Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Beginning to process: 20200116_Ta11_file2.txt.pgp
2020-01-17T01:04:47.252Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Got file info outgoing/professional/20200116_Ta11_file2.txt.pgp
2020-01-17T01:04:48.197Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    file deleted outgoing/professional/20200116_Ta11_file2.txt.pgp
2020-01-17T01:04:48.199Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    Successfully processed: 20200116_Ta11_file2.txt.pgp
2020-01-17T01:04:48.199Z    6630b8b7-764d-4940-87f8-d6ada6b6eb84    INFO    JOB COMPLETED 
END RequestId: 6630b8b7-764d-4940-87f8-d6ada6b6eb84
REPORT RequestId: 6630b8b7-764d-4940-87f8-d6ada6b6eb84  Duration: 3775.81 ms    Billed Duration: 3800 ms    Memory Size: 1536 MB    Max Memory Used: 105 MB Init Duration: 541.10 ms    

1 Ответ

0 голосов
/ 17 января 2020

Я пропустил возврат в разделе ниже. Возвращения уже там.

sftp.connect({
                    host: hostTargetName,
                    port: '22',
                    username: userName,
                    password: password
                }).then(() => {
                    return sftp.put(buffer, remoteFilePath);
                }).then(() => {
                    return sftp.end(); 
                }).then(() => {
                    return deleteEncryptedlFile(obj.Key);  //this part of code not shown
                }).then(() => {
                    console.log("Successfully processed: " + filename);
                    resolve();
                }).catch(err => {
                    console.error("ALERT in transfer for " + filename + ": " + err.message);
                    resolve();
                });
...