Лямбда-функция в экземпляр S3 не загружается

#amazon-web-services #amazon-s3 #aws-lambda

#amazon-web-services #amazon-s3 #aws-lambda

Вопрос:

Приведенный ниже код позволяет мне обновлять изображение или видео в S3 из командной строки как узел js, но не из функции lamba, можно ли узнать, почему? Лямбда-функция не возвращает никаких ошибок, она просто не загружает файл.

 const fs = require('fs');
const http = require('http');
const AWS = require('aws-sdk');
const request = require('request');

function uploadFile(data, fileName)
{
    const s3 = new AWS.S3();


     console.log(data)
     const params = {
         Bucket: 'trakbucket', // pass your bucket name
         Key: fileName, // file will be saved as testBucket/contacts.csv
         Body: JSON.stringify(data, null, 2)
     };
     s3.upload(params, function(s3Err, data) {
         if (s3Err) throw s3Err
         console.log(`File uploaded successfully at ${data.Location}`)
  });
};


exports.handler = async (event) => {
    let videoURL = "http://farm4.static.flickr.com/3123/2341623661_7c99f48bbf_m.jpg";
    let file_name = "video.mp4"
    let file_path = "/tmp/"    file_name
    request.get(videoURL, function (error, response, body) {
        if (!error amp;amp; response.statusCode == 200) {
            var data = body;
            console.log(data)
            uploadFile(data, file_name)
            console.log("End")
        }
    });
};
  

Ответ №1:

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

Один из способов исправить это — использовать Promise , как показано в документах AWS. Например:

 exports.handler = async (event) => {

    const promise = new Promise(function(resolve, reject) {

        let videoURL = "http://farm4.static.flickr.com/3123/2341623661_7c99f48bbf_m.jpg";
        let file_name = "video.mp4"
        let file_path = "/tmp/"    file_name
        request.get(videoURL, function (error, response, body) {
            if (!error amp;amp; response.statusCode == 200) {
                var data = body;
                console.log(data)
                uploadFile(data, file_name)
                console.log("End")
            }
        });

      })

  return promise;       
};
  

Вышеуказанные изменения являются только примерными, поэтому, вероятно, некоторые корректировки все же потребуются.

Комментарии:

1. Я перевел его в режим синхронизации, и все работало правильно, я постараюсь использовать promise в асинхронном режиме, но это должно быть то, что вы указали. Большое спасибо!