AWS-Lambda только частично загружает файл из Интернета - PullRequest
0 голосов
/ 09 января 2019

У меня есть функция AWS Lambda, которая загружает mp3-файл случайного видео YT по ссылке (в коде).
При локальном запуске файл завершает загрузку, а размер файла в конце составляет ~ 8 МБ. Но при выполнении на Lambda он загружает только около 17 КБ ~ файла.

let link = "http://cdl29.convert2mp3.net/download.php?id=youtube_ivpU-4LJaZk&key=hvjquS9UNKoq&d=y"

request
.get(link)
.pipe(fs.createWriteStream("/tmp/name"))
.on("finish", () => {
    console.log(fs.statSync("/tmp/name").size/1000000.0)
    fs.readFile('/tmp/name', function(err, content) {
        if (err) return callback(err)
        console.log("Got here")
    })
})

Нет ошибок, все работает успешно. Но похоже, что fs.createWriteStream заканчивается до того, как загрузка фактически завершится во время работы на Lambda. Есть идеи?

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

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я предполагаю, что вы видите разницу в поведении из-за логики на сервере.

Возможности:

(1) Вы вошли в систему (возможно, не осознавая этого) в локальном браузере. Попробуйте перейти по той же ссылке в окне инкогнито, чтобы проверить это. Службе могут потребоваться учетные данные, иначе она перенаправит вас.

(2) Сервис проверяет пользовательский агент. Вы можете проверить это, попытавшись локально ОТКЛЮЧИТЬ URL, вместо того, чтобы идти через браузер.

(3) Это блокировка по IP - работает ли на вашем компьютере точно такая же логика javascript? Если у вас есть доступ к нему, вы можете попробовать тот же код на своем компьютере, другом компьютере, возможно, экземпляре EC2 и т. Д., И посмотреть, какие критерии он может проверять.

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

0 голосов
/ 09 января 2019

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

Какую версию узла вы используете?

Если это Node 6 -> вы не вызываете обратный вызов после успешной загрузки, а только во время ошибки

Если это Узел 8 -> полностью забыть о обратных вызовах и вместо этого использовать обещание. AWS фактически ожидает, что вы вернете обещание, которое было либо решено, либо отклонено, что указывает либо на успех, либо на ошибку.

module.exports.handle = event => new Promise((resolve, reject) => {

   let link = "http://cdl29.convert2mp3.net/download.php?id=youtube_ivpU-4LJaZk&key=hvjquS9UNKoq&d=y"

  request
  .get(link)
  .pipe(fs.createWriteStream("/tmp/name"))
  .on("finish", () => {
      console.log(fs.statSync("/tmp/name").size/1000000.0)
      fs.readFile('/tmp/name', function(err, content) {
        console.log("Got here")
        err ? reject(err) : resolve(content);
      })
   })

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...